为什么以下递归函数给出了'atm'和'hatm'的输出?

时间:2013-10-23 19:12:45

标签: python recursion

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

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

但为什么呢?

3 个答案:

答案 0 :(得分: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"

答案 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