我正在观看麻省理工学院的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)
以下是我的理解:
第一次递归:
初始化计数器= 0
如果找到key是target,counter = countSubStringMatchRecursive(target [slice_pos:],key) 这应该将计数器再次重置为0,因为主要功能正在运行
计数器+ = 1
返回1作为计数器值,因为0 + 1 = 1
我不明白的部分是为什么counter = 0没有将计数器重新初始化为0.相反,它让自己累积前一个值并产生正确的结果
答案 0 :(得分:3)
counter
是方法的本地变量。这意味着每个递归堆栈帧(每个新方法调用获得一个新的“堆栈帧”)都有自己的counter
副本。因此,虽然每次调用该方法时counter
都设置为0
,但counter
的所有这些副本实际上都是不同的内存块,并且不会相互影响。