字符串递归:'return s [0] == s [-1] and isPal(s [1:-1])'行是做什么的?

时间:2018-11-05 21:39:08

标签: 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':
                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上运行了它,似乎在第一次运行此行时,它首先递归进行,即删去了bcb和{{1} },然后以c作为基本情况,它返回true,同样返回c

我很困惑的两件事:

  1. 为什么它第一次运行此行代码时递归执行? bcb应该返回一个布尔值T / F,但这似乎一直被忽略,直到达到基本情况为止。

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

1 个答案:

答案 0 :(得分:1)

好吧,您必须逐步思考:

  1. 您将with open(infile_name,"r") as in_file, open('output.txt','w') as f_out: for chunk in iter_dates_in_file(in_file): if test_if_i_should_save(chunk): f_out.write(chunk) 传递给abcba
  2. isPalindrome呼叫isPalindrome
  3. isPal(toChars(s))返回toChars(s),因此将其传递给"abcba"
  4. isPal(..)与参数isPal一起调用。
  5. 检查:是"abcba"吗?不,len(s)<=1len(s)
  6. 5来说:else是吗?是。如果不是,此函数将在此处停止并返回s[0] == s[-1]。但现在进入下一步。
  7. 由于Falses[0] == s[-1],因此我们需要评估True。请记住,isPal(s[1:-1])现在是s[1:-1]。因此,运行"bcb"
    1. isPal("bcb")len("bcb"),请转到3
    2. elses[0] == s[-1]。评估True,其中isPal(s[1:-1])现在是s[1:-1]
      1. "c"len(s),因此:1
    3. return True返回了isPal(s[1:-1]),所以Trues[0] == s[-1] and isPal(s[1:-1])。返回True
  8. True返回了isPal(s[1:-1]),所以Trues[0] == s[-1] and isPal(s[1:-1])
  9. True返回isPal(toChars(s)):您有回文!!

希望这会让您更清楚。

编辑,步骤6始终位于步骤7之前,因为Python在逻辑表达式中明确地从左向右移动,请参见here。如果这没有发生,则说明您的解释器已损坏。