Recursividade quebra de strings

13 respostas
T

Boa tarde

Estou tentando fazer uns exercícios de JAVA…

Onde preciso quebrar uma string e verificar se a mesma é um número de 0 a 9… de forma recursiva…

Estou usando o método split();

public boolean isNumero(String palavra) 
	{

		String[] stringDividida = palavra.split("");

Já tentei incansáveis vezes hoje o dia todo, mas não consigo resolver essa questão, nem de forma normal (sem recursividade)

Alguém poderia me dar uma ideia??

Desde já agradeço.

13 Respostas

D

como assim ?

de um exemplo da string e um exemplo do resultado.

E

Esse é o famoso problema que, enunciado de forma recursiva, seria mais ou menos assim:

Se a string tiver comprimento 1 e o caracter dessa string estiver entre 0 e 9, então retornar true, senão retornar false.
Senão, se a string tiver comprimento > 1, veja se a substring (1) (ou seja, a string original, descontada a primeira posição) é numérica.
Se a string tiver comprimento zero, ela não é numérica.

T

entanglement:
Esse é o famoso problema que, enunciado de forma recursiva, seria mais ou menos assim:

Se a string tiver comprimento 1 e o caracter dessa string estiver entre 0 e 9, então retornar true, senão retornar false.
Senão, se a string tiver comprimento > 1, veja se a substring (1) (ou seja, a string original, descontada a primeira posição) é numérica.
Se a string tiver comprimento zero, ela não é numérica.

Acho que você entendeu bem! Talvez até melhor que eu, rsrs

Olhem o enunciado…

Um problema comum em computação é a verificação se uma cadeia de caracteres de uma variável armazena um valor numérico, ou não.
Quer dizer, se em todas as posições desta variável se existem apenas números entre 0 e 9.
Altere o método isNumero() da classe ApenasCaracteres.java que recebe como argumento um parâmetro do tipo String e retorna um boolean,
sendo true quando existirem apenas números e false se em alguma posição existir algo que não for um número.
Esse método deve ser implementado de forma recursiva.

Estou nisso o dia todo… Que chatísse…

public class ApenasCaracteres 
{

	public boolean isNumero(String palavra) 
	{


		char[] stringDividida = palavra.toCharArray();


		if (stringDividida.length == 0 && stringDividida.equals(0))
		{
			return true;
		}
		else
		{
			return isNumero(palavra-1);
		}

	}
}
E

Então, é mais ou menos assim:

public static boolean isNumeric (String s) {
    if (s.length() == 0)
        return false;
    else if (s.length() == 1) 
        return isDigit (s.charAt(0));
    else return isNumeric (s.substring (1));
}
D

Veja se isso funciona.

public boolean isNumero(String palavra)   
    {  
        
          char[] stringDividida = palavra.toCharArray();  
          String caracteres="[telefone removido]";
        
           for(int i  = 0 ; i < stringDividida.lenght;i++){
              if(!caracteres.contains(stringDividida[i])){
                       return false;
               }
            }
            return true;
       }
  
      
  
    }
E

Demys, ele quer uma rotina recursiva. Se ele só quisesse criar uma rotina para checar se uma string é um número, ele poderia usar algo como:

public static boolean isNumber (final String s) {
    try { Long.parseLong (s); return true;} catch (NumberFormatException ex) {return false; }
}
T

Deixando a recursão de lado…

Qual é o algoritmo para verificar caractere por caractere se o mesmo é um numero entre 0 e 9??

E

entanglement:
Esse é o famoso problema que, enunciado de forma recursiva, seria mais ou menos assim:

Se a string tiver comprimento 1 e o caracter dessa string estiver entre 0 e 9, então retornar true, senão retornar false.
Senão, se a string tiver comprimento > 1, veja se a substring (1) (ou seja, a string original, descontada a primeira posição) é numérica.
Se a string tiver comprimento zero, ela não é numérica.

Estou repetindo aqui, porque se você implementar exatamente como estou falando, vai ter a rotina. Não vou dar isso em Java de mão beijada. Só lhe dei a dica de usar s.substring (1).

Por exemplo, digamos que s = “123456789”.
s.substring(1) é “23456789”, ou seja, é a string original, descontada a primeira posição.

T

entanglement:
entanglement:
Esse é o famoso problema que, enunciado de forma recursiva, seria mais ou menos assim:

Se a string tiver comprimento 1 e o caracter dessa string estiver entre 0 e 9, então retornar true, senão retornar false.
Senão, se a string tiver comprimento > 1, veja se a substring (1) (ou seja, a string original, descontada a primeira posição) é numérica.
Se a string tiver comprimento zero, ela não é numérica.

Estou repetindo aqui, porque se você implementar exatamente como estou falando, vai ter a rotina. Não vou dar isso em Java de mão beijada. Só lhe dei a dica de usar s.substring (1).

Por exemplo, digamos que s = “123456789”.
s.substring(1) é “23456789”, ou seja, é a string original, descontada a primeira posição.

Certo mas eu tentei isso aí… mas eu não consigo pegar de 1 em 1 caracter…

por isso usei o toCharArray

J

entanglement:
Então, é mais ou menos assim:

public static boolean isNumeric (String s) { if (s.length() == 0) return false; else if (s.length() == 1) return isDigit (s.charAt(0)); else return isNumeric (s.substring (1)); }

entanglement, seu código só verifica se o último caracter é numérico, falta uma coisinha no seu código.

public static boolean isNumeric (String s) {
    if (s.length() == 0)
        return false;
    else if (s.length() == 1) 
        return isDigit (s.charAt(0));
    else return (isNumeric (s.substring (1)) && isDigit(s.charAt(0));
}

Assim ele valida recursivamente cada caracter e quando chega no final volta validando os anteriores.

E

s.substring (1) retorna uma string que é igual à string s, só que com o primeiro caracter removido. Acho que você está confundindo com s.substring(1,2) ou com s.substring (s.length() - 1, s.length())

J

Exatamente, mas analise seu código, ele só vai checar se o último caracter é numérico, não o resto. Olha o trecho:

else return isNumeric (s.substring (1));

Vai mandar a substring recursivamente, até chegar no último char e dizer se este é numérico, o retorno de todas as chamadas será a validação desse último caracter. Se adicionar a minha linha:

else return (isNumeric (s.substring (1)) && isDigit(s.charAt(0));

Ele checa um por um.

V

A resposta que postei no seu outro tópico idêntico não resolveu?

Por favor, não duplique tópicos, causa muita confusão.

Criado 8 de maio de 2013
Ultima resposta 17 de mai. de 2013
Respostas 13
Participantes 6