这个 while 循环是如何计算的? (x = 函数(x))
How does this while-loop compute? (x = function(x))
我正在做一个来自 "Automate the Boring Stuff with Python" 的测验,在稍微修改这个问题之后,我终于找到了一个有效的解决方案(在我的一个 comp-sci 伙伴的帮助下)。测验要求我编写执行 Collatz 序列的程序。
我理解所有代码背后的逻辑,除了最后一行。
这是我的代码和一些注释:
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 值,并将其用于另一次计算。
我的问题出在最后一行。这是我的理解:
- 一旦我进入 while 循环,我的函数 "collatz" 就会被调用,使用我的输入值
- 函数是运行,我的输入是计算出来的,根据输入,我在return
中得到偶数或奇数计算
- 这就是我的脑袋疼!
- 行 "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。所以每次,主循环都会通过,猜测的值也会更新
我正在做一个来自 "Automate the Boring Stuff with Python" 的测验,在稍微修改这个问题之后,我终于找到了一个有效的解决方案(在我的一个 comp-sci 伙伴的帮助下)。测验要求我编写执行 Collatz 序列的程序。
我理解所有代码背后的逻辑,除了最后一行。
这是我的代码和一些注释:
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 值,并将其用于另一次计算。
我的问题出在最后一行。这是我的理解:
- 一旦我进入 while 循环,我的函数 "collatz" 就会被调用,使用我的输入值
- 函数是运行,我的输入是计算出来的,根据输入,我在return 中得到偶数或奇数计算
- 这就是我的脑袋疼!
- 行 "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。所以每次,主循环都会通过,猜测的值也会更新