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

时间:2013-03-29 04:37:42

标签: python recursion

我正在观看麻省理工学院的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,因为主要功能正在运行

  3. 计数器+ = 1

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

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

1 个答案:

答案 0 :(得分:3)

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