我目前正在使用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')

这行代码让我很困惑:我在Python Tutor上运行它,第一次运行这行代码时,它似乎先递归地运行,即去掉return s[0] == s[-1] and isPal(s[1:-1])bcb,然后由于c是基本情况,所以它返回true,对于c
我困惑的两件事:
为什么它第一次运行这行代码时会递归地运行?bcb应该返回一个布尔值t/f,但在它到达基本大小写之前,它似乎被忽略了?
所以递归一直运行到它到达基本情况-我得到了,但是s[0]==s[-1]并不是只在它到达这里之前才开始运行…为什么?代码的语法如何指示计算机计算bcb上的s[0]==s[-1]?

最佳答案

你必须一步一步地考虑:
您将abcba传递到isPalindrome
isPalindrome呼叫isPal(toChars(s))
toChars(s)返回"abcba",因此传递给isPal(..)
isPal用参数"abcba"调用。
检查:是否len(s)<=1?不,len(s)5
那么要else:是s[0] == s[-1]对。如果不是,这个函数将在这里停止并返回False但现在进入下一步。
因为s[0] == s[-1]True我们需要评估isPal(s[1:-1])。记住,s[1:-1]现在是"bcb"。所以运行isPal("bcb")
len("bcb")3所以转到else
s[0] == s[-1]是指True。评估isPal(s[1:-1])其中s[1:-1]现在是"c"
len(s)1,因此:return True
isPal(s[1:-1])返回True所以s[0] == s[-1] and isPal(s[1:-1])True返回True
isPal(s[1:-1])返回True所以s[0] == s[-1] and isPal(s[1:-1])True
isPal(toChars(s))返回:您有一个回文!
希望这能让你更清楚。
编辑步骤6总是在步骤7之前,因为Python在逻辑表达式中显式地从左到右,请参见here如果这不发生,你的翻译就坏了。

关于python - 字符串递归:'return s [0] == s [-1] and isPal(s [1:-1])'行是做什么的?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/53162619/

10-10 18:25