【问题标题】:Why is the counter not being reset to 0 in a recursive function?为什么在递归函数中计数器没有被重置为 0?
【发布时间】:2013-03-29 12:41:39
【问题描述】:

我正在观看 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. counter+=1

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

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

【问题讨论】:

    标签: python recursion


    【解决方案1】:

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

    【讨论】:

    • 谢谢吉米。几个问题: 1. 既然有多个副本,我们如何知道返回的是哪个计数器副本?是否总是返回初始副本(第一个堆栈)?
    • 是的,当方法返回counter 时,它会返回counter 的OWN 副本。因此,当您第一次调用它时,您将取回counter 的第一个副本。基本上,你可以把它想象成你的方法是一个黑盒子,你并不关心它在内部做什么。因此,当您递归调用它时,只需假设它会给您返回正确的答案,并且不会弄乱您的任何变量。
    猜你喜欢
    • 2017-01-03
    • 1970-01-01
    • 2021-12-26
    • 1970-01-01
    • 2013-12-17
    • 2022-12-06
    • 1970-01-01
    • 2012-01-05
    • 1970-01-01
    相关资源
    最近更新 更多