为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

收到一只叮咚 2022-11-18 20:49:57
我是一名全新的编程研究生,遇到了一些麻烦。我正在解决一个教科书问题,该问题要我取一个正整数并打印该数字的 Collatz 序列。    while num !=1:        print(num)        if num%2==0:            num = num//2    else:        num = 3*num+1print(1)现在,此代码有效。我得到了数学逻辑。但是有些部分我不明白。首先是 print(num),这样做是为了让代码打印输入的数字,因为那是序列的开始。但是,将其置于循环前端的逻辑/解释是什么?其次,对于 num = num//2 和 num = 3*num+1,为什么代码运行只需要这些?最后,我们的目标是打印整个序列,直到输入变为 1。我认为您需要在顶部设置一个累加器。即 lst = [] 将每个值附加到该列表中,然后返回列表。为什么只是重新标记它们 num = 工作?每次迭代时,是否不会删除先前的值,因为它没有存储在任何地方?最后,为什么我们不需要以 return 结束循环?它怎么知道打印整个数字序列?它以 print(1) 结束,因为每个输入都需要以它结束,并且它在 1 之前终止。但是,我没有调用该函数(它是我这边的一个函数,而不仅仅是一个 while 循环)来采取行动。它只是……做到了。如果这有点令人困惑,我很抱歉,但我正在尝试理解正确的代码答案。我大部分时间都在做累加器之类的东西,所以我不确定为什么不需要累加器,num = 做了什么,以及如何用 print(1) 结束它并出现整个序列。
查看完整描述

2 回答

?
缥缈止盈

TA贡献2041条经验 获得超4个赞

首先是 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,该函数的执行仍然结束,返回值为Nonereturn不参与打印输出。print如上所述,这就是工作。

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


查看完整回答
反对 回复 2022-11-18
?
郎朗坤

TA贡献1921条经验 获得超9个赞

  1. 这就是没有列表的输出“神奇地出现”的方式

  2. 见#1

  3. 你总是从一个函数返回......在这种情况下你没有返回,而是打印列表

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

这个站点:python tutor - 看看它是如何工作的

有助于可视化代码执行


查看完整回答
反对 回复 2022-11-18
  • 2 回答
  • 0 关注
  • 85 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信