Python中的可变范围问题

我是Python的新手,并且已经使用了一段时间,但是遇到了问题.这是我的代码:

def collatz(num,ctr):
    if(num != 1):
        ctr+=1
        if(num%2==0):
            collatz(num/2,ctr)
        else:
            collatz(num*3+1,ctr)
    return ctr
test=collatz(9,0)

对于我输入的任何数字,例如以9为例,对于ctr为0,则ctr总是以1表示.我使用ctr变量是否错误?

编辑:
我正在尝试打印出函数重复执行了多少次.因此,点击率将是每次递归的计数器.

解决方法:

由于递归调用堆栈的顺序,示例中的变量ctr始终为1.返回一个ctr值后,调用堆栈将开始返回ctr的先前值.基本上,在最后一次递归调用时,将返回最高的ctr值.但是由于调用堆栈底部的方法调用返回的最后一个值即将要存储在测试中的值,因此test始终为1.假设我向collat​​z输入参数,这将导致对该方法进行总共5次调用.调用堆栈看起来像这样,

collatz returns ctr --> 5
collatz returns ctr --> 4
collatz returns ctr --> 3
collatz returns ctr --> 2
collatz returns ctr --> 1 //what matters because ctr is being returned with every method call

如您所见,无论调用collat​​z多少次,总会返回1,因为调用堆栈底部的调用的ctr等于1.

解决方案可能有很多事情,但实际上取决于您要完成的目标,而问题并未明确说明.

编辑:如果您希望ctr最终成为递归调用的次数,则只需将ctr分配给方法调用的值即可.看起来应该像这样

def collatz(num,ctr):
    if(num != 1):
        ctr+=1
        if(num%2==0):
            ctr = collatz(num/2,ctr)
        else:
            ttr = collatz(num*3+1,ctr)
    return ctr
test=collatz(9,0)
上一篇:c – 多次调用alloca()会导致堆栈的连续部分?


下一篇:c – 为什么malloc / new会捕获callstack?