2

我正在观看 MIT 对 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。相反,它让自己累积先前的值并产生正确的结果

4

1 回答 1

3

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

于 2013-03-29T04:41:39.333 回答