python – 字符串递归:行’返回s [0] == s [-1]和isPal(s [1:-1])’做什么?

我目前正在使用MITx和字符串的递归通过6.00.1x,但以下代码确实让我感到困惑.这应该告诉一个字符串是否是一个回文(一个向后读取向前),abcba作为我使用的测试字符串:

def isPalindrome(s):

    def toChars(s):
        s = s.lower()
        ans = ''
        for c in s:
            if c in 'abcdefghijklmnopqrstuvwxyz':
                ans = ans + c
        return ans

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

    return isPal(toChars(s))

isPalindrome('abcba')

行返回s [0] == s [-1]和isPal(s [1:-1])真让我困惑:我在Python Tutor上运行它,似乎第一次运行这行时,它会递归地运行首先,即切掉bcb和c,然后c将是基本情况,它返回true,同样为bcb.

我困惑的两件事:

>为什么它在第一次运行这行代码时会递归递归? s [0] == s [-1]应返回一个布尔值T / F,但这似乎已被忽略,直到达到基本情况?
>所以递归运行直到达到基本情况 – 我得到了,但是然后s [0] == s [-1]直到它到达这里才开始运行…为什么?那么代码的语法如何指示计算机在bcb上评估s [0] == s [-1]?

最佳答案 那么你必须一步一步地思考:

>您将abcba传递给isPalindrome
> isPalindrome调用isPal(toChars(s))
> toChars(s)返回“abcba”,因此将其传递给isPal(..)
>使用参数“abcba”调用isPal.
>检查:len(s)< = 1?不,len(s)是5.
>那么对于:是[0] == s [-1]?是.如果不是,则此函数将在此处停止并返回False.但现在到下一步.
>由于s [0] == s [-1]为True,我们需要评估isPal(s [1:-1]).请记住,s [1:-1]现在是“bcb”.所以运行isPal(“bcb”).

> len(“bcb”)是3所以去其他地方.
> s [0] == s [-1]为True.评估isPal(s [1:-1]),其中s [1:-1]现在是“c”.

> len(s)为1,因此:返回True

> isPal(s [1:-1])返回True,因此s [0] == s [-1]和isPal(s [1:-1])为True.返回True.

> isPal(s [1:-1])返回True,因此s [0] == s [-1]和isPal(s [1:-1])为True.
> isPal(toChars(s))返回True:你有一个回文!

希望这能让你更清楚.

编辑步骤6始终在步骤7之前,因为Python在逻辑表达式中显式从左到右,请参阅here.如果没有发生这种情况,您的解释器就会被破坏.

点赞