我的任务是定义一个过程is_palindrome,它接受一个字符串作为输入,并返回一个布尔值,指示输入字符串是否为回文结构。在这种情况下,单个字母应返回True,空字符串''
也应如此。
不幸的是,我没有得到预期的结果。我很感激帮助。
我的代码版本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)
我通过调试器跟踪了我的代码,似乎逻辑是正确的,因为代码采用了适当的路径。但是,如上所述,某些案例的最终结果似乎会转为“无”。
如果我将代码更改为以下内容:
我的代码版本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
答案 0 :(得分:7)
在您的第一个示例中,您忘记了一个返回声明:
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
答案 1 :(得分:4)
is_palindrome(s[1:len(s)-1])
需要......
return is_palindrome(s[1:len(s)-1])
在您的第一个版本中,或
result = is_palindrome(s[1:len(s)-1])
在你的第二个。否则,您实际上永远不会将递归调用的返回值传播回原始调用者。
答案 2 :(得分:3)
# 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"
答案 3 :(得分:2)
def is_palindrome(s):
if not s:
return True
else:
return s[0]==s[-1] and is_palindrome(s[1:-1])
或者,如果你想要一个单行:
def is_palindrome(s):
return (not s) or (s[0]==s[-1] and is_palindrome(s[1:-1]))
希望有所帮助
答案 4 :(得分:2)
让我们逐行逐步完成你的第二个例子。:
def is_palindrome(s):
在这种情况下,让我们让s =“abba”,这是你收到错误的第一个字符串:
if s == '':
评估为
if 'abba' == '':
哪个是False
,因此我们跳到else
:
else:
if (ord(s[0]) - ord(s[len(s)-1])) == 0:
此if
语句相当于:
if (97 - 97) == 0:
它是True
,所以递归发生:
is_palindrome(s[1:len(s)-1])
或
is_palindrome('bb')
现在无论这个递归的结果如何,我们都会忽略它,因为不会保存返回值。因此,当我们到达这一行时:
return result
我们从来没有定义result
是什么,所以Python翻了出来。
其他海报已经很好地回答了你的问题。我发帖说明了跟踪程序查找/修复错误的重要性。
答案 5 :(得分:0)
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));
}
}