为什么在递归函数中计数器没有被重置为0



我正在看麻省理工学院对ComScip的介绍,必须做一个递归调用。我很难很好地安装一个计数器来计算字符串出现的数量。幸运的是,下面的解决方案可以工作,但我不知道为什么:

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. 如果key是target, counter=countSubStringMatchRecursive (target[slice_pos:], key)这将使计数器再次重置为0,因为main函数正在运行

  3. 计数器+ = 1

  4. 返回1作为计数器值,因为0+1=1

我不明白的部分是为什么counter=0不重新初始化计数器为0。相反,它让自己累积前一个值并产生正确的结果

counter是方法的局部变量。这意味着每个递归堆栈帧(每个新方法调用获得一个新的"堆栈帧")都有自己的counter副本。因此,当counter在每次调用该方法时被设置为0时,counter的所有这些副本实际上是不同的内存块,并且不会相互影响。

最新更新