Python递归判断回文字符串代码遇回文返回None的原因解析
问题原因与解决方法
核心问题:递归调用未返回结果
你代码里的递归分支犯了一个关键错误:当首尾字符相等时,你只调用了palindrome(w),但没有把这个递归调用的结果返回给上层函数。
举个实际执行的例子,假设输入是"abba":
- 第一次调用
palindrome(['a','b','b','a']),首尾都是a,删除首尾后调用palindrome(['b','b']) - 第二次调用
palindrome(['b','b']),首尾都是b,删除首尾后调用palindrome([]) - 第三次调用
palindrome([]),满足长度为0的条件,返回'yes' - 但第二次调用里,只是执行了
palindrome([]),没有把这个'yes'返回出去,所以第二次调用结束后默认返回None - 同理,第一次调用也没有接收第二次调用的结果,最终返回
None
修正代码
只需要在递归调用的地方加上return,让结果逐层传递回去:
def palindrome(w): if len(w)==0 or len(w)==1: return 'yes' else: if w[0]==w[-1]: del w[0] del w[-1] return palindrome(w) # 新增return,传递递归结果 else: return 'no' s=input() w=list(s.replace(" ","")) print(palindrome(w))
更简洁的优化方案
其实不需要修改原列表(del操作会改变原列表,容易引发副作用),可以直接用字符串/列表切片来生成新的子序列,代码更简洁安全:
def palindrome(w): if len(w) <= 1: return 'yes' if w[0] == w[-1]: return palindrome(w[1:-1]) # 用切片获取中间子序列,无需修改原数据 else: return 'no' s=input() w = s.replace(" ","") # 字符串也支持切片,不用转成列表 print(palindrome(w))
内容的提问来源于stack exchange,提问作者Hiruni Sathsarani
相关产品推荐
相关产品推荐

