我正在为即将到来的考试练习一些编程问题。这是我不明白的练习题之一:
“以下代码(在 Python 中)打印什么?”
def f(s):
if len(s) <= 1:
return s
return f(f(s[1:])) + s[0] #Note double recursion
print f('mat')
print f('math')
显然,答案是
atm
hatm
但为什么?
f("mat") = f(f("at"))+"m" -> f(f(f("t"))+"a") +"m" -> f("ta") + "m" -> "atm"
f("ta") = f(f("a")) + "t" -> f("a") + "t" -> "at"
f("at") = f(f("t"))+"a" -> f("t")+"a" - > "ta"
f("t") = "t"
要遵循递归调用的流程,请启动一个调试器,例如跨平台的Winpdb,您将看到所有调用都带有它们的参数。
要尝试理解递归中的“模式”,请尝试使用数字运行函数,以便可视化排列
>>> print f('12')
21
>>> print f('123')
231
>>> print f('1234')
4231
>>> print f('12345')
23451
>>> print f('123456')
456231
>>> print f('1234567')
3426751
f('mat')
f(f('at')) + 'm'
f('at') = f(f('t')) + 'a'
f('t') = 't'
f('at') = f('t') + 'a'
f('t') = 't'
f('at') = 'ta'
f('ta') + 'm'
f('ta') = f(f('a')) + 't'
f('a') = 'a'
f('ta') = f('a') + 't'
f('a') = 'a'
f('ta') = 'at'
'atm'