繁体   English   中英

这个while循环如何计算? (x =函数(x))

[英]How does this while-loop compute? (x = function(x))

我正在从“用Python自动化无聊的东西”中进行测验,在对问题进行了修补后,我终于找到了一个可行的解决方案(在我的comp-sci伙伴的帮助下)。 测验要求我编写执行Collat​​z序列的程序。

我理解所有代码背后的逻辑,除了最后一行。

这是我的代码,带有一些注释:

def collatz(number):
    if number % 2 == 0:
    print(number // 2)
        return number // 2
    elif number % 2 == 1:
        print(3 * number + 1)
        return 3 * number + 1

guess = input("Your guess please ")
while guess != 1:
    guess = collatz(int(guess))

程序的输出是一个数字序列,因为while循环以某种方式重新迭代了函数的返回值,并将其用于其他计算。

我的问题是最后一行。 这是我的理解方式:

  1. 进入while循环后,使用输入值调用函数“ collat​​z”
  2. 运行该函数,并计算我的输入,然后基于该输入,我得到偶数或奇数计算
  3. 这是我的大脑受伤的地方!
  4. 现在“ guess = collat​​z(...)”行是否正在不断更新“ guess”,使其等于从函数中重新调整的值? 如果是这种情况,那么我完全理解流程。 如果不是这种情况,那么我不明白如何将返回值不断用于新的计算。

另外,这就是所谓的“递归”吗?

简短答案:

是。

更长的答案:(仍然很短)

collatz函数返回一个分配给guess的值。

同样,这称为递归,递归是一个自称的函数。

首先,不,这不是递归。 递归是一个自我调用的函数。

例如,这是一个递归:

def fibonacci(n):   
    if n == 0:
        return 0
    if n == 1:
        return 1
   return fibonacci(n-1) + fibonacci(n-2)

如您在这里看到的,fibonacci函数将调用fibonacci函数...但是它也有退出条件(n == 0,n == 1)。 否则,这将导致运行时错误,并提示消息已超过最大递归深度。 但是,如果我没记错的话,您可以使用以下命令检查最大递归深度:

import sys
print(sys.getrecursionlimit())

在我的计算机上,这个数字是1000。如果这个数字对您来说太小,您也可以使用以下命令进行设置:

sys.setrecursionlimit(n)

关于其他事情。 您的函数正在返回一些计算值,并且在您的主循环中,这将分配给变量猜测。 因此,每次主循环都会通过,猜测值也会更新

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM