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

时间:2014-01-17 17:32:52

标签: python algorithm recursion

所以我正在做exercise 6 from chapter 7 from Think Python并且让我感到奇怪的是,我作为解决方案编写的这段代码不起作用:

def is_palindrome(word):
    if len(word) <= 1:
        return True
    elif first(word) == last(word):
        is_palindrome(middle(word))
    else:
        return False

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

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

def first(word):
    return word[0]

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

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

3 个答案:

答案 0 :(得分: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

因此,当您输入None块时,您的当前片段将返回elif,因为您在那里没有明确的return语句。换句话说,你计算is_palindrome(middle(word)),但你对结果一无所知。

也许通过一个简单的例子会有所帮助。考虑使用'aba'

参数调用原始函数
  • 函数叫
  • word现在是'aba'
  • len(word) <= 1Falseif - 未输入正文。
  • first(word) == last(word)Trueelif - 正文输入:
    • 递归调用的函数:
    • word现在是'b'
    • len(word) <= 1Trueif - 正文输入:
      • True已退回
  • 丢弃递归调用的返回值(因为return中没有elif
  • None已退回

答案 1 :(得分:1)

添加return

return is_palindrome(middle(word))

答案 2 :(得分:1)

我认为您缺少在函数的第5行返回方法。

return is_palindrome(middle(word))

应该在那里而不是

 is_palindrome(middle(word))