2011-10-24 23 views
5

Tengo problemas con una pregunta de mi clase de programación II y he chocado contra una pared de ladrillos, me preguntaba si alguien podría ayudarme.Comparación de cadenas dobles usando la recursión

La pregunta pide que un usuario ingrese una cadena, el programa para invertir la cadena de entrada y luego para comparar el reverso con el original, esto debe hacerse recursivamente.

hasta ahora tengo:

public class question1 
{ 
public static void main(String args[]) 
{ 

String input = JOptionPane.showInputDialog(null, "Please enter a sentence to determine if it is a palindrome."); 
String backwardsinput = Reverse(input); 
System.out.println(backwardsinput); 
boolean Palindrome = PalindromeCheck(backwardsinput, input); 

    if (Palindrome == true) 

     { 
     JOptionPane.showMessageDialog(null,"That is a palindrome!"); 
     } 

    if (Palindrome == false) 

     { 
     JOptionPane.showMessageDialog(null,"That is not a palindrome"); 
     } 

} 

public static String Reverse (String input) 
{ 
    if (input.length() <= 1) 
    return input; 

    else 
    { 
     char x = input.charAt(input.length()-1);    
     return x+Reverse(input.substring(0,input.length()-1)); 
    } 

} 



public static boolean PalindromeCheck (String backwardsinput, String input) 
{ 

    if(input.length() == 0 || input.length() == 1) 
      return true; 

     if(backwardsinput.charAt(0) == input.charAt(input.length()-1)) 
      return PalindromeCheck(backwardsinput.substring(1, backwardsinput.length()-1), input.substring(1, input.length()-1)); 

     else 
     return false; 

     }  
} 

Mi problema es que me dice que todo es un palíndromo, he mirado una y otra vez y no puedo entender por qué!

+0

Quizás deberían * primero * enseñarle cómo * formatear * su código, luego pasar a otros temas. – Bohemian

+0

Si pudieras señalar lo que estoy haciendo mal o señalarme algunos recursos sobre el tema, te lo agradecería. Solo quiero aprender y hacer el mejor trabajo posible después de todo. – Eogcloud

+0

@Bohemian: No es el peor formato que he visto, ¡es solo el trabajo que necesita más trabajo! Y Eogcloud, ¡me gusta tu código a pesar del formateo y los errores! :-) – Andy

Respuesta

6

Estás haciendo el trabajo dos veces (más o menos).

if(backwardsinput.charAt(0) == input.charAt(input.length()-1)) 
              ^^^^^^^^^^^^^^^^ 

debe ser

if (backwardsinput.charAt(0) == input.charAt(0)) 
              ^

Casi lo consiguió :-)


Además, otra forma de expresar

if (cond) 
    return something; 
else 
    return false; 

es

return cond && something; 

así sus últimas líneas se podrían escribir como

return backwardsinput.charAt(0) == input.charAt(0) && 
     palindromeCheck(backwardsinput.substring(1, backwardsinput.length() - 1), 
           input.substring(1, input.length() - 1)); 

pregunta relacionada/respuesta:

+0

Lo último es útil, no sabía que se podían estructurar declaraciones de retorno como tal, ¡gracias! – Eogcloud

+0

Gracias aiobe, no estaba al tanto de esa forma de regresar, pero ahora que lo pienso, no tiene sentido porque es como una declaración de una sola línea si no. – Andy

+0

¿Qué no tiene sentido? ¿Mi propuesta? – aioobe

2

usted está invirtiendo la cadena y luego comprobar ing la cadena combina esto invertido. es decir, prueba que la secuencia se invirtió correctamente.

Cuando se puede hacer, no se invierte la cadena y solo se comprueba que una cadena se empareja (más velocidad que la inversa) hacia atrás.

+0

¡Esa sería la situación ideal! desafortunadamente para mí, la pregunta especifica que debemos invertirla y comparar recursivamente el original con el reverso :( – Eogcloud

+0

Puedes reservarlo y comparar el primer personaje con el primer personaje para comparar cadenas. –

3
if(backwardsinput.charAt(0) == input.charAt(input.length()-1)) 

Esto no funciona. Quiere backwardsinput.charAt(0) == input.charAt(0). porque lo inviertes

Cuando puedo depurar algo como esto, que tienden a separar todas mis instrucciones compuestas, por lo

if(backwardsinput.charAt(0) == input.charAt(input.length()-1)) 

se convertiría en

char bc = backwardinput.charAt(0); 
char ic = input.charAt(input.length()-1); 
System.println(bc); 
System.println(ic); 
if (bc == ic) { 

Todos cometemos errores tontos cuando tratamos de poner demasiado en una expresión, por lo que estos son buenos lugares para comenzar a buscar errores de lógica.

+0

Ese desglose lógico es una idea increíble, genial forma de encontrar errores. ¡Gracias! – Eogcloud

Cuestiones relacionadas