为什么我的用于检查回文的python算法不起作用?

shi*_*sho 1 python algorithm recursion

所以我从Think Python的第7章开始练习6,它让我感到很奇怪,我作为解决方案编写的这段代码不起作用:

def is_palindrome(word):
    if len(word) <= 1:
        return True
    elif first(word) == last(word):
        is_palindrome(middle(word))
    else:
        return False
Run Code Online (Sandbox Code Playgroud)

它不会进入任何递归,我不知道为什么.对于长度超过1个字符的单词,它返回None.为什么是这样?当单词的长度达到1或更小时,它应该返回True!为什么不起作用?

PS:这是第一个,最后一个和中间的定义:

def first(word):
    return word[0]

def last(word):
    return word[-1]

def middle(word):
    return word[1:-1]
Run Code Online (Sandbox Code Playgroud)

ars*_*jii 5

你错过了一个return:

def is_palindrome(word):
    if len(word) <= 1:
        return True
    elif first(word) == last(word):
        return is_palindrome(middle(word))  # <--
    else:
        return False
Run Code Online (Sandbox Code Playgroud)

因此,None一旦elif输入了块,您的当前片段就会返回,因为那里没有明确的return语句.换句话说,你计算is_palindrome(middle(word)),但你没有对结果做任何事情.

也许通过一个简单的例子会有所帮助.考虑使用以下参数调用原始函数'aba':

  • 功能叫
  • word 就是现在 'aba'
  • len(word) <= 1False, - if没有进入.
  • first(word) == last(word)True,elif-body输入:
    • 递归调用的函数:
    • word 就是现在 'b'
    • len(word) <= 1True,if-body输入:
      • True
  • 丢弃的递归调用的返回值(因为我们没有returnelif)
  • None