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

我是一名全新的编程研究生,遇到了一些麻烦。我正在解决一个教科书问题,该问题要我取一个正整数并打印该数字的 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 = 工作?每次迭代时,是否不会删除先前的值,因为它没有存储在任何地方?


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


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


收到一只叮咚
浏览 86回答 2
2回答

缥缈止盈

首先是 print(num),这样做是为了让代码打印输入的数字,因为那是序列的开始。但是,将其置于循环前端的逻辑/解释是什么?它被放置在原处,因为它不只是用来打印输入的数字。每次到达代码中的那个点时,它都会打印代码中那个点发生的任何num事情。在第一次迭代中,是序列的第一个元素。在第二次迭代中,现在是序列的第二个元素。在第三次迭代中,是第三个元素,依此类推。这将打印序列的每个元素,除了,因为循环在该点中断,这就是为什么在循环之后有一个单独的元素。numnumnumprint1print(1)其次,对于 num = num//2 和 num = 3*num+1,为什么代码运行只需要这些?最后,我们的目标是打印整个序列,直到输入变为 1。我认为您需要在顶部设置一个累加器。即 lst = [] 将每个值附加到该列表中,然后返回列表。为什么只是重新标记它们 num = 工作?每次迭代时,是否不会删除先前的值,因为它没有存储在任何地方?print(num)在计算时打印每个序列元素,因此程序不需要显式保存元素。该程序确实忘记了以前的值,但它们已经被打印出来了。记住打印输出是其他工具的工作——例如,如果您使用指向文件的 stdout 运行它,打印输出将写入文件。最后,为什么我们不需要以 return 结束循环?它怎么知道打印整个数字序列?它以 print(1) 结束,因为每个输入都需要以它结束,并且它在 1 之前终止。但是,我没有调用该函数(它是我这边的一个函数,而不仅仅是一个 while 循环)来采取行动。它只是……做到了。return有两个工作:结束当前函数执行,设置返回值。如果执行到一个函数的末尾而没有执行一个return,该函数的执行仍然结束,返回值为None。return不参与打印输出。print如上所述,这就是工作。至于不调用该函数,我们无法回答这是怎么回事。我们需要查看您实际运行的内容,包括实际功能。

郎朗坤

这就是没有列表的输出“神奇地出现”的方式见#1你总是从一个函数返回......在这种情况下你没有返回,而是打印列表将 atime.sleep放在那里(在你的循环内)以可视化正在发生的事情可能会有所帮助这个站点:python tutor - 看看它是如何工作的有助于可视化代码执行
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python