我正在为即将到来的考试练习一些编程问题。这是我不理解的练习题之一:
“以下代码(在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
但为什么呢?
答案 0 :(得分:4)
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"
答案 1 :(得分:2)
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'
答案 2 :(得分:2)
要跟踪递归调用的流程,启动调试器,例如跨平台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