我正在看麻省理工学院对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,因为main函数正在运行
计数器+ = 1
返回1作为计数器值,因为0+1=1
我不明白的部分是为什么counter=0不重新初始化计数器为0。相反,它让自己累积前一个值并产生正确的结果
counter
是方法的局部变量。这意味着每个递归堆栈帧(每个新方法调用获得一个新的"堆栈帧")都有自己的counter
副本。因此,当counter
在每次调用该方法时被设置为0
时,counter
的所有这些副本实际上是不同的内存块,并且不会相互影响。