2012-01-02 80 views
5

我正在閱讀獲得「反轉」徽章的答案,我發現一個關於遞歸的問題,即OP沒有打擾他們做許多家庭作業。除了一些真正有趣的答案之外,@ machielo在python中發佈了an answer,我必須在我的機器上運行才能掌握它。我仍然不理解它。我不明白這是遞歸使用

def recursive(x): 
    if x > 10: 
     print recursive(x/10) 
    return x%10 

>>> recursive(2678) 
2 
6 
7 
8 

我嘗試了我的第一個猜測,但我知道這是錯

>>> 2678/10 
267 
>>> 267/10 
26 
>>> 26/10 
2 
>>> 2%10 
2 

好吧......這是兩個。這是如何評估x中其他數字的輸出?

編輯

這是print聲明,我不明白這裏。我修改了代碼,例如:

>>> def recursive(x): 
if x > 10: 
    print x 
    print recursive(x/10) 
return x%10 

>>> #I will comment the interpreter session here... 
>>> recursive(2345) 
2345 # first feed in...print the raw number `x` 
234 # 2345/10 does equal 234...the 5 is being held back somewhere... 
23 # and each pass through the recursive loop removes the last digit... 
2 # but where was it being stored at, so that each evaluation of 
3 # x > 10 finally started returning False 
4 # and returns the number, exiting the function 
5 # ... 

我在想,在每個貫穿,調用print recursive(x/10)創建一個新的函數對象,每個都有它自己的全新的基本情況和輸入法...

另一個提示,任何人?

FINALLY

感謝大家。我覺得我現在明白了......這個技巧並不是print,因爲它是x%102345%10 == 5 ...

>>> def recursive(x): 
print "Raw `x`:", x 
if x > 10: 
    print "Recurse `x`:", x 
    print recursive(x/10) 
print "Last `x`:", x  
return x%10 

>>> recursive(2345) 
Raw `x`: 2345 
Recurse `x`: 2345 
Raw `x`: 234 
Recurse `x`: 234 
Raw `x`: 23 
Recurse `x`: 23 
Raw `x`: 2 
Last `x`: 2 
2 
Last `x`: 23 
3 
Last `x`: 234 
4 
Last `x`: 2345 
5 

此外,信貸對誰進去,並更新了最初的回答是I previously linked to ...我要給予好評您的評論:

>>> def recursive(x): 
if x >= 10: 
    print recursive(x/10)  
return x%10 
+0

我想我不完全理解這個問題。 「x'中的每個數字」是什麼意思? – 2012-01-02 23:04:52

+0

我不想用我所有的錯誤猜測**來渾濁我的問題,但** ...用'return recursive(x/10)'替換'print recursive(x/10)'將會把基本情況推到遞歸的第一遍。 – Droogans 2012-01-02 23:06:44

+0

您的示例不會爲我生成該輸出 – joaquin 2012-01-02 23:08:43

回答

11

我認爲,加入少量print聲明它是真正有幫助的:

def recursive(x): 
    print '[start] recursive({0})'.format(x) 
    if x > 10: 
    print recursive(x/10) 
    print '[return] recursive({0}) = {1}'.format(x, x%10) 
    return x%10 

print recursive(2678) 

輸出是:

[start] recursive(2678) 
[start] recursive(267) 
[start] recursive(26) 
[start] recursive(2) 
[return] recursive(2) = 2 
2 
[return] recursive(26) = 6 
6 
[return] recursive(267) = 7 
7 
[return] recursive(2678) = 8 
8 
+0

很好的答案,真的 – joaquin 2012-01-02 23:21:38

+0

@joaquin謝謝,我很感激。 – jcollado 2012-01-02 23:32:03

+0

我複製了你的格式並稍微修改了一下,這樣我就可以強制自己從內存中構建它。好例子! – Droogans 2012-01-02 23:56:47

3

此函數打印出的數字的數字。

它的工作原理是這樣的:

def recursive(x): 
    if x > 10: 
    # Divide x by 10 and round down. This chops off the last decimal place. 
    # Now feed that new x without the last decimal place back into recursive() 

    # return x's last digit 

基本上,它不會print任何東西,直到x是一個單一的數字。

您感到困惑的部分可能是爲什麼它按順序打印出每個小數位。發生這種情況是因爲在函數遞歸時,父函數仍在運行。

只需嘗試並展開該單個號碼的代碼即可。


編輯:我混淆自己爲好。

代碼調用之前returnprint,這意味着當最後水平遞歸結束,第二個到最後打印出的第一位。下一層也是如此。

+0

好的@Blender,我會寫出我模仿堆棧圖的可怕嘗試。 – Droogans 2012-01-02 23:10:35

5

通過您的例子僞步進(破折號的數字表示遞歸深度):

-call recursive(2678) 
--2678 > 10, call recursive(267) 
---267 > 10, call recursive(26) 
----26 > 10, call recursive(2) 
-----return 2%10 (which is 2) 
----print 2, then return 26 % 10 (which is 6) 
---print 6, then return 267 % 10 (which is 7) 
--print 7, then return 2678 % 10 (which is 8) 
-return 8 
+0

所以你說'print'語句直到遞歸循環的後期才被評估,即使如此......它實際上並不顯示結果?這是你打印2,然後返回26%10'的意思嗎?你的最後一行是'return 8',這就是我爲什麼這樣想的原因。 – Droogans 2012-01-02 23:31:26

+0

@Droogans我認爲這是正確的。最後8是由控制檯打印的 – joaquin 2012-01-02 23:34:36

+0

這不是它沒有評估。 print語句不能被解析,因爲它不斷地遞歸調用方法。直到它在底部返回一個值,這些值才能被解析,因此遞歸可以被看作是冒泡的答案。 – Jordan 2012-01-02 23:37:29

1

在考慮遞歸時記住調用堆棧。遞歸調用是推動所有recursive()函數調用到任何打印之前,所以你最終與堆棧上的堆棧

recursive(2) # end condition is met so returns 2%10 
recursive(26) 
recursive(267) 
recursive(2678) # the initial call 

一旦達到2%,結束條件10返回到以前的(2)函數的打印語句並打印,那麼該函數返回26%10(6),並且這一過程一直持續到堆棧上的所有遞歸函數調用都返回。結果是這一系列的打印呼叫:

print 2 
print 6 
print 7 
8 

8實際上沒有打印;它只是從翻譯中返回而已。如果你想確保它打印在例如python腳本中,你可以打電話print recursive(2678)