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

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

我正在做一个来自 "Automate the Boring Stuff with 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 循环以某种方式重新迭代函数的 returned 值,并将其用于另一次计算。

我的问题出在最后一行。这是我的理解:

  1. 一旦我进入 while 循环,我的函数 "collatz" 就会被调用,使用我的输入值
  2. 函数是运行,我的输入是计算出来的,根据输入,我在return
  3. 中得到偶数或奇数计算
  4. 这就是我的脑袋疼!
  5. 行 "guess = collatz(...)" 现在是否不断更新 "guess" 以等于函数的返回值?如果是这样的话,那我就完全理解流程了。如果不是这样,那么我不明白 returned 值是如何不断用于新计算的。

还有,这就是所谓的"recursion"吗?

简答:

是的。

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

collatz 函数正在返回分配给 guess 的值。

另外,这不是所谓的递归,递归是一个函数,它会调用自己。

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

例如这是一个递归:

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

正如你在这里看到的斐波那契函数将调用斐波那契函数...但它也有一个退出条件(n == 0,和 n == 1)。否则,这将导致运行时错误,并显示超出最大递归深度的消息。但是如果我没记错的话,你可以用下面的命令检查递归的最大深度是多少:

import sys
print(sys.getrecursionlimit())

在我的电脑上,这个数字是1000。如果这个数字对你来说太小,你也可以用这个命令来设置它:

sys.setrecursionlimit(n)

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