我是一名全新的编程研究生,并且遇到了一些麻烦。我正在解决一个教科书问题,希望我取一个正整数并打印该数字的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)结尾,因为每个输入都必须以该结尾,并且它在1之前终止。但是,我尚未调用该函数(它是我的函数,而不仅仅是while循环)来采取行动。它只是...做到了。
很抱歉,这有点令人困惑,但是我试图理解正确的代码答案。我大部分时间都在做累加器和东西,所以我不确定为什么它不需要一个,num =做了什么,以及如何只用print(1)结束并显示整个序列。
答案 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
的情况下到达函数的末尾,则该函数的执行仍将结束,返回值为None
。 return
不参与打印输出。如上所述,这就是print
的工作。
至于不调用该函数,我们无法回答发生了什么。我们需要查看您实际运行的内容,包括实际功能。
答案 1 :(得分:0)
将time.sleep
放在其中(在循环内)以可视化发生的情况可能会有所帮助
此网站:python tutor - see how it works
有助于可视化代码执行