有人可以帮我分解并理解这个 collatz 序列代码吗?

  • 本文关键字:collatz 代码 分解 python
  • 更新时间 :
  • 英文 :


我是一个全新的编程研究生,遇到了一些麻烦。我正在解决一个教科书问题,它希望我取一个正整数并打印该数字的 Collatz 序列。

while num !=1:
print(num)
if num%2==0:
num = num//2
else:
num = 3*num+1
print(1)

现在,此代码有效。我明白了数学逻辑。但有些部分我不明白。

首先,print(num(,这样做是为了代码打印输入数字,因为这开始了序列。但是,将其放在循环的前面的逻辑/解释是什么?

其次,对于 num = num//2 和 num = 3*num+1,为什么这就是运行代码所需的全部内容?最后,我们的目标是打印整个序列,直到输入达到 1。我以为你需要一个蓄能器在上面。即 lst = [] 将每个值附加到该列表中,然后返回列表。为什么只是重新标记它们 num = 有效?每次迭代时,不会删除以前的值,因为它没有存储在任何地方?

最后,为什么我们不需要用返回来结束循环?它怎么知道打印整个数字序列?它以 print(1( 结尾,因为每个输入都需要以 print(1( 结尾,并且在 1 之前终止。但是,我没有调用该函数(这是我的函数,而不仅仅是一个 while 循环(来采取行动。 只是...做到了。

如果这有点令人困惑,我很抱歉,但我正在尝试理解正确的代码答案。我主要在做累加器和东西,所以我不确定为什么这不需要一个,num = 做了什么,以及如何用 print(1( 结束它并出现整个序列。

首先,print(num(,这样做是为了代码打印输入数字,因为这开始了序列。但是,将其放在循环的前面的逻辑/解释是什么?

它被放置在原处,因为它不仅仅是为了打印输入数字。每次到达代码中的该点,它都可以打印代码中该点num碰巧出现的任何内容。在第一次迭代中,num是序列的第一个元素。在第二次迭代中,num现在是序列的第二个元素。在第三次迭代中,num是第三个元素,依此类推。此print打印序列的每个元素,除了1,因为循环在那个点中断,这就是为什么循环后有一个单独的print(1)

其次,对于 num = num//2 和 num = 3*num+1,为什么这就是运行代码所需的全部内容?最后,我们的目标是打印整个序列,直到输入达到 1。我以为你需要一个蓄能器在上面。即 lst = [] 将每个值附加到该列表中,然后返回列表。为什么只是重新标记它们 num = 有效?每次迭代时,不会删除以前的值,因为它没有存储在任何地方?

print(num)在计算时打印每个序列元素,因此程序不需要显式保存元素。程序确实忘记了以前的值,但它们已经打印出来了。记住打印的输出是其他工具的工作 - 例如,如果您在将 stdout 定向到文件的情况下运行它,则打印的输出将写入该文件。

最后,为什么我们不需要用返回来结束循环?它怎么知道打印整个数字序列?它以 print(1( 结尾,因为每个输入都需要以 print(1( 结尾,并且在 1 之前终止。但是,我没有调用该函数(这是我的函数,而不仅仅是一个 while 循环(来采取行动。 只是...做到了。

return有两个作业:它结束当前函数执行,并设置返回值。如果在执行到达函数的末尾而不执行return,则函数的执行仍然结束,返回值为Nonereturn不参与打印输出。如上所述,这是print的工作。

至于不调用函数,我们无法回答这是怎么回事。我们需要查看您实际运行的内容,包括实际功能。

  1. 这就是输出在没有列表的情况下"神奇地出现"的方式
  2. 见#1
  3. 你总是从一个函数返回...在本例中,您返回的是 None,而是打印列表

time.sleep放在那里(在您的循环内(以可视化正在发生的事情可能会有所帮助

这个网站 : Python 导师 - 看看它是如何工作的

有助于可视化代码执行

最新更新