有人可以帮助我分解并理解此collat​​z序列代码吗?

时间:2020-05-14 04:56:51

标签: python

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

    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)结尾,因为每个输入都必须以该结尾,并且它在1之前终止。但是,我尚未调用该函数(它是我的函数,而不仅仅是while循环)来采取行动。它只是...做到了。

很抱歉,这有点令人困惑,但是我试图理解正确的代码答案。我大部分时间都在做累加器和东西,所以我不确定为什么它不需要一个,num =做了什么,以及如何只用print(1)结束并显示整个序列。

2 个答案:

答案 0 :(得分: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)结尾,因为每个输入都必须以该结尾,并且它在1之前终止。但是,我尚未调用该函数(它是我的函数,而不仅仅是while循环)来采取行动。它只是...做到了。

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

至于不调用该函数,我们无法回答发生了什么。我们需要查看您实际运行的内容,包括实际功能。

答案 1 :(得分:0)

  1. 这是在没有列表的情况下输出“神奇地出现”的方式
  2. 请参阅#1
  3. 您总是从函数返回...在这种情况下,您将返回None,而是打印列表

time.sleep放在其中(在循环内)以可视化发生的情况可能会有所帮助

此网站:python tutor - see how it works

有助于可视化代码执行