gpt4 book ai didi

python - Python 中的变量范围问题

转载 作者:行者123 更新时间:2023-11-28 16:22:47 25 4
gpt4 key购买 nike

我是 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)

对于我为 num 输入的任何数字,例如 90ctr , ctr 始终显示为 1。我是否使用了错误的 ctr 变量?

编辑:我试图打印出函数被递归的次数。所以 ctr 将是每个递归的计数器。

最佳答案

由于递归调用堆栈的顺序,您示例中的变量 ctr 将始终为 1。当返回 ctr 的一个值时,调用堆栈将开始返回 ctr 的先前值。基本上,在最后一次递归调用时,将返回 ctr 的最高值。但是由于调用堆栈底部的方法调用返回最后一个值,也就是将存储在 test 中的值,test 将始终为 1。假设我将参数输入到 collat​​z 中,这将导致该方法总共调用五次。调用堆栈看起来像这样下来,

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)

关于python - Python 中的变量范围问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38903023/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com