2013-03-29 31 views
2

我正在看麻省理工介紹ComScip,並且必須做一個遞歸調用。我很難在計數器中很好地計算字符串外觀的數量。隨着一種好運,並與櫃檯的位置開始播放,後續的解決方案的工作,但我不知道爲什麼:爲什麼在遞歸函數中計數器不會被重置爲0?

import string 
target = "banana" 
key = "an" 
key_len = len(key) 
found_pos = 0 
found_pos = string.find(target,key) 

def countSubStringMatchRecursive (target, key): 
    counter=0 
    found_pos = string.find(target,key) 
    if(found_pos!=-1):  
     print "found" 
     slice_pos = found_pos + key_len 
     counter = countSubStringMatchRecursive (target[slice_pos:], key) 
     counter+=1 
     #print counter 
    return counter 

print countSubStringMatchRecursive (target, key) 

這是我的理解:

首先遞歸:

  1. 初始化計數器= 0

  2. 如果發現密鑰是目標,計數器= countSubStringMatchRecursive(target [slice_pos:],key) 這應該計數器復位到0再次因爲主要功能是正在跑

  3. 計數器+ = 1

  4. 返回1作爲計數器值,因爲0 + 1 = 1

我不該部分不明白爲什麼計數器= 0不將計數器重新初始化爲0.相反,它讓自己累積先前的值併產生正確的結果

回答

3

counter是該方法的局部變量。這意味着每個遞歸堆棧幀(每個新的方法調用都獲得一個新的「堆棧幀」)都有自己的counter副本。因此,每次調用該方法時,counter設置爲0,而所有這些counter副本實際上都是不同的內存塊,並且不會相互影響。

+0

謝謝吉米。幾個問題:1.我們如何知道哪些計數器副本因爲有多個副本而被返回?它總是被返回的初始副本(第一個堆棧)? – user2223224

+0

是的,當方法返回'counter'時,它返回它的'counter'的OWN副本。因此,當你第一次打電話時,你會得到'counter'的第一個副本。基本上,你可以把它看作是你的方法是一個黑盒子,你不關心它在內部做什麼。所以當你遞歸地調用它時,只要假設它會給你回正確的答案,而不是混淆你的任何變量。 –

相關問題