4

我正在为即将到来的考试练习一些编程问题。这是我不明白的练习题之一:

“以下代码(在 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

但为什么?

4

3 回答 3

4
  1. 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"
于 2013-10-23T19:21:47.143 回答
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
于 2013-10-23T19:34:14.353 回答
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'
于 2013-10-23T19:30:24.777 回答