2013-10-23 56 views
4

我正在爲即將到來的考試練習一些編程問題。這是我不明白的練習題之一:爲什麼下面的遞歸函數會給出輸出'atm'和'hatm'?

「下面的代碼(在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 

但是,爲什麼?

+5

做_you_覺得它應該打印? – wim

+1

手動穿過它。爲每個遞歸調用縮進。 – clcto

+1

我的錯誤,應該是'帽子'。 –

回答

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"
+0

啊哈!謝謝。我對[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

要遵循的遞歸調用流,啓動調試器,如跨平臺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