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