Transformar todos os char de uma String em maiúsculo com recursividade

Fiz esse código para realizar isso, mas sem sucesso, compila e não faz nada

public static String toMaiusculo (String s,int i){
        StringBuffer textoMaiusculo = new StringBuffer ();
        char c = s.charAt(0);
        if (s.length()>1) {
        Character.toUpperCase(c);
        textoMaiusculo.append(c);
            textoMaiusculo.append(toMaiusculo(s.substring(1)));
        }
        return textoMaiusculo.toString();
    }

Onde está o erro?

O char é imutável, tens de atribuir o valor novamente a c.

c = Character.toUpperCase(c);
2 curtidas

Deu certo! Mas estou com outro problema na mesma questão. Preciso de um método recursivo que remova os espaços da String e um que remova todas as ocorrências do primeiro caracter da String. Está assim

public static String RemoveEspaco (String s, int i) {
        StringBuffer textoSemEspaco = new StringBuffer ();
        char c = s.charAt(0);
        textoSemEspaco.append(c);
        if (s.length()>1) {
            if (c == ' ')
                RemoveEspaco(s.substring(1));
            else
                textoSemEspaco.append(RemoveEspaco(s.substring(1)));
        }
        return textoSemEspaco.toString();
    }


    public static String RemoveChar (String s, char c, int i) {
        StringBuffer textoSemChar = new StringBuffer ();
        char d = s.charAt(0);
        textoSemChar.append(c);
        if (s.length()>1) {
            if (d == c)
                RemoveChar(s.substring(1),c);
            else
                textoSemChar.append(RemoveChar(s.substring(1),c));
        }
        return textoSemChar.toString();
    }

Ambos estão removendo tudo

Aqui estás a ignorar o que é devolvido pelo método. Provavlemente queres fazer return deste resultado…

1 curtida

Código básico para conversão de um contéudo de um String tudo em maiúsculo:

public static void ToUpper(char[] values, int index)
{
	if (index < values.length)
	{
		values[index] = String.valueOf(values[index])
				.toUpperCase()
				.charAt(0);
		ToUpper(values, index + 1);
	}
}

Como usar?

String texto = "guj site";
int index = 0;
char[] values = texto.toCharArray();
ToUpper(values, index);


System.out.println(texto);
System.out.println(String.valueOf(values));

DEMO

Essa forma foi feita bem mais simples e reduz a complexidade do código (idéia de @pmlm):

Maiúsculo:

public static String toUpperCase(String t)
{
	if (t.length() == 0) return "";
	return String.valueOf(String.valueOf(t.toCharArray()[0])).toUpperCase() + 
			toUpperCase(t.substring(1));
};

Sem espaço:

public static String noSpace(String t)
{
	if (t.length() == 0) return "";
	return t.charAt(0) != ' ' ?
		t.charAt(0) + noSpace(t.substring(1)) :
		noSpace(t.substring(1));
};

Como utilizar:

String cd = "guj site";
    
System.out.println(toUpperCase(cd));
System.out.println(noSpace(cd));

A partir do momento que usas um index e vais incrementando não sei se podes considerar recursivo. É simplesmente um ciclo “disfarçado” :slight_smile:

Na verdade, é um processo recursivo, aonde o método para ter um fim utilize o seu paramento como termino do método. Eu gostaria de saber de você @pmlm, então, como seria um código recursivo, nesse caso?

Eu faria algo assim

public static String toUpper(String values) {
    if (values.length() == 0){
        return "";
    }
    return Character.toUpperCase(values.charAt(0)) + toUpper(values.substring(1));
}
1 curtida

@pmlm

Esse código resolve o problema, mas, eu não vejo o meu código como falso recursividade, pelo motivo que eu utilizei um vetor.

Exemplos em sites tem o mesmo tipo:

int somatoria(int vetor[], int tamanho)
{
   if (tamanho > 0)
      return vetor[tamanho - 1] + somatoria(vetor, tamanho - 1);
   else
      return 0;
}

Referencia: [Recursividade (ciência da computação)](https://pt.wikipedia.org/wiki/Recursividade_(ciência_da_computação)

Existe várias formas de implementação!

Sim! Era só colocar um return antes. Muito obrigado!