我目前正在使用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
。
我很困惑的两件事:
为什么它第一次运行此行代码时递归执行? bcb
应该返回一个布尔值T / F,但这似乎一直被忽略,直到达到基本情况为止。
所以递归一直运行到达到基本情况-我得到了,但是s [0] == s [-1]直到它到达这里才开始运行...为什么?代码的语法如何指示计算机评估bcb上的s [0] == s [-1]?
答案 0 :(得分: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
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。如果这没有发生,则说明您的解释器已损坏。