gpt4 book ai didi

python - 递归字符串 : What does the line 'return s[0] == s[-1] and isPal(s[1:-1])' do?

转载 作者:太空宇宙 更新时间:2023-11-03 11:39:15 25 4
gpt4 key购买 nike

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

return s[0] == s[-1] and isPal(s[1:-1]) 真的让我很困惑:我在 Python Tutor 上运行它,似乎第一次运行这一行,它首先递归,即删除 bcbc,然后 c 将是基本情况,它返回 true,对于 bcb 也是如此。

我困惑的两件事:

  1. 为什么第一次运行这行代码就走递归? s[0] == s[-1] 应该返回一个 bool 值 T/F,但这似乎在到达基本情况之前一直被忽略?

  2. 所以递归一直运行到到达基本情况 - 我得到了,但是 s[0] == s[-1] 直到它到达这里才开始运行...为什么?代码的语法如何指示计算机计算 bcb 上的 s[0] == s[-1]?

最佳答案

那么你必须一步一步地思考:

  1. 你通过了abcbaisPalindrome
  2. isPalindrome电话 isPal(toChars(s))
  3. toChars(s)返回 "abcba"所以这是传递给isPal(..)
  4. isPal使用参数 "abcba" 调用.
  5. 检查:是len(s)<=1 ?不,len(s)5 .
  6. 所以到else : 是 s[0] == s[-1] ?是的。如果不是,这个函数会在这里停止并返回 False .但现在进入下一步。
  7. s[0] == s[-1]True我们需要评估 isPal(s[1:-1]) .请记住,s[1:-1]现在是"bcb" .所以运行 isPal("bcb") .
    1. len("bcb")3所以去else .
    2. s[0] == s[-1]True .评估isPal(s[1:-1])其中 s[1:-1]现在是 "c" .
      1. len(s)1 ,因此:return True
    3. isPal(s[1:-1])返回 True所以s[0] == s[-1] and isPal(s[1:-1])True .返回 True .
  8. isPal(s[1:-1])返回 True所以s[0] == s[-1] and isPal(s[1:-1])True .
  9. isPal(toChars(s))返回 True : 你有一个回文!

希望这能让您更清楚。

编辑 第 6 步总是在第 7 步之前,因为 Python 在逻辑表达式中明确地从左到右,参见 here .如果这没有发生,说明您的解释器坏了。

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com