這是一個遞歸的例子,你用原來輸入的短而短的子串重複調用函數本身,直到它是一個長度爲1的字符串(在原始輸入中的最後一個),在這種情況下它開始打印它,然後「展開」並反向打印剩餘的字符串。
在這個annoted代碼看看:
def function(s):
if len(s) == 1:
print 'single:', s[0], # (A) this is where your first output is generated for a single character
else:
print 'calling function again with ',s[1:]
function(s[1:]) # (B) you call function again, i.e., your recursive call
print ' unwind->', s[0], # (C) the "unwinding" step, i.e, finish the rest
# of the function when you return from the recursive call
你得到的輸出是:
calling function again with 234
calling function again with 34
calling function again with 4
single: 4 unwind-> 3 unwind-> 2 unwind-> 1
你叫你通過對else
條款和線(下降函數的第一次B)你再次調用函數,但是這次用「234」。現在函數再次啓動,但是以「234」開始,然後再次進入else
,現在再次調用函數,但現在再次運行「34」,函數再次運行,現在再次調用else
,並調用函數「4」這一次,因爲它的長度爲1,你打印它(A行)。
現在,您從此函數返回(展開過程) - 並從您進行遞歸調用之前的位置恢復,並通過打印當前剩餘字符的第一個字符來反向打印剩餘的字符串(C行)。
第一次遇到它時很難掌握遞歸 - 這很正常。在某個時候,它會點擊並變得清晰。您可能想要閱讀一般概念並找出一些清晰的註釋示例(大多數CS /編程書籍會有一些)。
下面是一個簡短的YouTube視頻,說明遞歸Python中一個簡單的例子,希望它有助於:http://www.youtube.com/watch?v=72hal4Cp_2I
我還是輸了。我也不太瞭解遞歸。是不是,如果你再次調用該函數,它會繼續調用它,因爲s [1:]的長度永遠不是1,所以不會打印任何內容? – VPNTIME 2012-04-20 03:11:37
@Omerta你缺少的是每次調用'function'時's'都是一個*不同's' *。一旦你有了,'len(s [1:])'最終會變爲1. – lvc 2012-04-20 03:17:13
謝謝Levon。我現在真的明白了。 – VPNTIME 2012-04-20 04:39:25