【问题标题】:Can somebody help me break down and understand this collatz sequence code?有人可以帮我分解并理解这个 collat​​z 序列代码吗?
【发布时间】:2020-05-14 13:10:44
【问题描述】:

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

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

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

【问题讨论】:

  • 过去几个小时内的第二个 collat​​z 问题 o.O ...
  • 哇,一个“解释这段代码”的问题,实际上给我们详细解释了你对代码不了解的地方。这真的很少见!

标签: python


【解决方案1】:

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

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

其次,对于 num = num//2 和 num = 3*num+1,为什么代码运行只需要这些?最后,我们的目标是打印整个序列,直到输入变为 1。我认为您需要一个累加器。即 lst = [] 将每个值附加到该列表中,然后返回该列表。为什么只是重新标记它们 num = 工作?每次迭代,不会把之前的值删除,因为它没有存储在任何地方吗?

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

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

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

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

【讨论】:

  • 不错的小说... :) +1
  • 这是一个巨大的崩溃 - 谢谢!我现在看得更清楚了。它不断迭代,新的 num 经历循环,因为它被重新定义,并在顶部打印,直到达到零。那么我的问题是 - 这是一个有效的代码吗?我习惯于累加器和附加到列表。例如,将 lst = [ ] 置于顶部并以这种方式收集值。这是可能的还是不太理想?
  • @ptoh64:取决于你想对序列元素做什么。如果您只想打印它们,那么随时打印并丢弃它们就可以了,并且不需要列表。如果你想保存序列并在程序中用它做其他事情,你不能只是打印和丢弃它们。
  • @user2357112supportsMonica 我唯一的目标是输入一个数字,然后打印序列直到我们达到 1。我也尝试过只是弄乱它并制作一个 numlst = [ ] 只是为了看看,它没有我的代码有所不同,所以似乎为了这个意义而添加它是没有意义的。超级感谢帮助。我对编写答案很陌生,但我自己也很难想到这些事情。
【解决方案2】:
  1. 这就是没有列表的输出“神奇地出现”的方式
  2. 见 #1
  3. 您总是从函数返回...在这种情况下,您返回的是 None,而不是打印列表

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

这个网站:python tutor - see how it works

有助于可视化代码执行

【讨论】:

  • 等等,不管怎样——如果我们把 return 或者没有放在函数的末尾,它会自动返回吗?我还想知道 num = 对等式的两个数学部分意味着什么。是不是你将 num 重新定义为新的数字,然后重复直到满足条件?最后,有没有办法使用累加器并像列表一样附加它?
  • 当然 ... 只需在您看到打印的任何地方附加到列表中...然后返回它...是的,它重新定义 num 直到 num 变为零...单击链接并逐步执行网站上的代码你看几次就明白了
  • 非常感谢!作为全新的,我需要像婴儿一样跟我说话哈哈。该网站将有很大帮助。我有时会感到沮丧。我来自非 STEM 背景,所以这些初学者问题可以让我难倒几个小时。可能对信心很不利,所以这会有所帮助。
猜你喜欢
  • 2021-12-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-14
  • 1970-01-01
  • 2016-04-28
  • 1970-01-01
相关资源
最近更新 更多