这个递归如何在python中工作?

Kie*_*lle 2 python recursion palindrome python-3.x

几个小时前我在python的递归中观看了一段视频,然后重新创建了在视频中制作的程序,因此它在我的Python版本中运行.代码可以工作,但有一点我不完全理解它正在做什么.

def lower(s):
    s = s.lower()
    return s

def isPal(s):
    if len(s) <= 1:
        return True
    else:
        return s[0] == s[-1] and isPal(s[1:-1])

def isPalindrome(s):
    if isPal(lower(s)) == True:
        print("{0} is a palindrome".format(s))
Run Code Online (Sandbox Code Playgroud)

我遇到问题的部分是

return s[0] == s[-1] and isPal(s[1:-1])
Run Code Online (Sandbox Code Playgroud)

我想知道为什么他们被退回,为什么它是[1:-1]而不是s [0:-1]如果你认为你知道任何有助于简化递归的好地方我随意分享他们.提前致谢.

Mar*_*cin 5

为什么它是[1:-1]而不是s [0:-1]

s[1:-1]返回s第一个和最后一个元素被切断.s[0:-1]只返回s最后一个元素.

您需要切断两端以保持回文性质(如果它是回文),即与中间等距的元素是相同的.如果你只切断一端,你移动中间,这将(在一般情况下)破坏该不变量.

这是自我递归的核心:你做了一件事,然后你委托一个具有相同属性的简单案例.

为什么返回s [0] == s [-1]和isPal(s [1:-1])

这是因为它首先检查第一个和最后一个元素是否具有回文属性(如上所述)并且下一个"图层"也具有该属性.如果外对不相等则不是回文,并将False返回; 如果为true,则执行递归步骤,如果为True,则返回表达式True.