Python 字符串上的递归:行';返回s[0]==s[-1]和isPal(s[1:-1])';做

Python 字符串上的递归:行';返回s[0]==s[-1]和isPal(s[1:-1])';做,python,recursion,Python,Recursion,我目前正在使用MITx和字符串递归处理6.00.1x,但下面的代码确实让我感到困惑。这是用来判断一个字符串是否是回文(一个前后读相同的字符串),我使用abcba作为测试字符串: def isPalindrome(s): def toChars(s): s = s.lower() ans = '' for c in s: if c in 'abcdefghijklmnopqrstuvwxyz':

我目前正在使用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')
def isPalindrome:
def toChars(多个):
s=s.下()
ans=“”
对于s中的c:
如果“abcdefghijklmnopqrstuvxyz”中的c:
ans=ans+c
返回ans
def isPal(s):

如果len(s)那么你必须一步一步地思考:

  • 您将
    abcba
    传递给
    isAlindrome
  • isPalindrome
    调用
    isPal(toChars))
  • tocars
    返回
    “abcba”
    ,因此这将传递给
    isPal(…)
  • isPal
    通过参数
    调用“abcba”

  • 检查:
    len(s)是什么让您认为
    s[0]==s[-1]
    表达式被忽略了?试着输入一个不是回文的字符串,你会发现它有效果。@PatrickArtner这是麻省理工学院课程“计算机科学与编程入门Python”中的代码(顺便说一句,这是非常棒的)。我相信这是一个教递归的教育性例子。而且,这个问题不应该被否决,IMO.尝试理解递归函数没有错。在像
    abcde
    这样的输入上尝试一下,看看它是否真的执行了递归调用,然后再测试第一个和最后一个字符是否相等。
    是一个短路运算符,因此,如果比较结果为
    False
    ,则不应执行递归调用。该问题声称步骤7发生在步骤6之前,并询问原因。谢谢!您的解释非常清楚,并且真正解释了代码的行为,我想我对连接中递归是如何工作的有点困惑,但现在已经清楚了