python: comprobación recursiva para determinar si la cadena es un palíndromo

Mi tarea es definir un procedimiento is_palindrome, que toma como entrada una cadena y devuelve un valor booleano que indica si la cadena de entrada es un palíndromo. En este caso, una sola letra debe devolver True, al igual que una cadena vacía '' .

Desafortunadamente, no estoy obteniendo los resultados esperados. Aprecio la ayuda.

Mi código de la versión 1:

 def is_palindrome(s): if s == '': return True else: if (ord(s[0]) - ord(s[len(s)-1])) == 0: is_palindrome(s[1:len(s)-1]) else: return False print is_palindrome('') #>>> True (expected = True) print is_palindrome('abab') #>>> False (expected = False) print is_palindrome('abba') #>>> None (expected = True) print is_palindrome('andrea') #>>> None (expected = False) print is_palindrome('abaaba') #>>> None (expected = True) 

Seguí mi código a través del depurador y parece que la lógica es correcta, ya que el código toma la ruta adecuada. Sin embargo, el resultado final parece cambiar a ‘Ninguno’ para algunos de los casos como se resaltó anteriormente.

Si cambio mi código a lo siguiente:

Mi código de la versión 2:

 def is_palindrome(s): if s == '': result = True else: if (ord(s[0]) - ord(s[len(s)-1])) == 0: is_palindrome(s[1:len(s)-1]) else: result = False return result print is_palindrome('') #>>> True (expected = True) print is_palindrome('abab') #>>> False (expected = False) print is_palindrome('abba') #>>> Error (expected = True) UnboundLocalError: local variable 'result' referenced before assignment print is_palindrome('andrea') #>>> Error (expected = False) UnboundLocalError: local variable 'result' referenced before assignment print is_palindrome('abaaba') #>>> Error (expected = True) UnboundLocalError: local variable 'result' referenced before assignment 

En su primer ejemplo, olvidó una statement de devolución:

 def is_palindrome(s): if s == '': return True else: if (ord(s[0]) - ord(s[len(s)-1])) == 0: # v-- forgot this here return is_palindrome(s[1:len(s)-1]) else: return False 
  is_palindrome(s[1:len(s)-1]) 

necesita ser…

  return is_palindrome(s[1:len(s)-1]) 

en su primera versión, o

  result = is_palindrome(s[1:len(s)-1]) 

en tu segundo De lo contrario, nunca propagará el valor devuelto de la llamada recursiva al llamante original.

 # ask user to enter any string a = raw_input("Enter the string : ") #palindrome check print (a == a[::-1]) and "String is palindrome" or "String is not palindrome" 

Veamos tu segundo ejemplo, línea por línea:

 def is_palindrome(s): 

En este caso, vamos a dejar s = “abba”, que es la primera cadena en la que recibiste un error:

  if s == '': 

se evalúa como

  if 'abba' == '': 

Lo que es False , así que saltamos a else :

  else: if (ord(s[0]) - ord(s[len(s)-1])) == 0: 

Esta sentencia if es equivalente a:

  if (97 - 97) == 0: 

Es True , entonces ocurre la recursión:

  is_palindrome(s[1:len(s)-1]) 

o

  is_palindrome('bb') 

Ahora, cualquiera que sea el resultado de esta recursión, lo ignoramos, porque el valor de retorno no se guarda. Así, cuando lleguemos a esta línea:

  return result 

Nunca definimos el result , por lo que Python se desvanece.

Otros carteles ya hicieron un excelente trabajo al responder tu pregunta. Estoy publicando para demostrar la importancia de rastrear un progtwig para encontrar / corregir errores.

 def is_palindrome(s): if not s: return True else: return s[0]==s[-1] and is_palindrome(s[1:-1]) 

o, si quieres un one-liner:

 def is_palindrome(s): return (not s) or (s[0]==s[-1] and is_palindrome(s[1:-1])) 

Espero que ayude

Respuesta en Java

 public class Varios { /** * @param args the command line arguments */ public static void main(String[] args) { System.out.println( pali("anitalavalatina")); } static boolean pali(String palabra){ System.out.println(palabra); if (palabra.length()-1<2) return true; if(palabra.charAt(0)!=palabra.charAt(palabra.length()-1)) return false; return pali(palabra.substring(1,palabra.length()-1)); } }