Collatz猜想序列

新手上路,请多包涵

科拉茨猜想

我想做的是:编写一个名为 collatz_sequence 的函数,它接受一个起始整数并返回整数序列,包括该数字的起点。以列表的形式返回序列。创建您的函数,以便如果用户输入任何小于 1 的整数,它会返回空列表 []。

collatz猜想的背景:

取任意自然数n。如果 n 是偶数,则除以 2 得到 n / 2,如果 n 是奇数,则将其乘以 3 加 1 得到 3n + 1。无限重复该过程。猜想是,无论你从什么数字开始,最终总会达到 1。

到目前为止我所拥有的:

 def collatz_sequence(x):
    seq = [x]
    if x < 1:
       return []
    while x > 1:
       if x % 2 == 0:
         x= x/2
       else:
         x= 3*x+1
    return seq

当我用小于 1 的数字运行它时,我得到了正确的空集。但是当我用大于 1 的数字运行它时,我只得到那个数字,即 collatz_sequence(6) 返回 [6]。我需要它来返回整个数字序列,所以 6 应该在列表中返回 6,3,10,5,16,8,4,2,1。

原文由 user1698174 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 504
2 个回答

您忘记将 x 值附加到 seq 列表:

 def collatz_sequence(x):
    seq = [x]
    if x < 1:
       return []
    while x > 1:
       if x % 2 == 0:
         x = x / 2
       else:
         x = 3 * x + 1
       seq.append(x)    # Added line
    return seq

确认:

 ~/tmp$ python collatz.py
[6, 3, 10, 5, 16, 8, 4, 2, 1]

原文由 Lauritz V. Thaulow 发布,翻译遵循 CC BY-SA 3.0 许可协议

def collatz_sequence(x):
    seq = [x]
    while seq[-1] > 1:
       if x % 2 == 0:
         seq.append(x/2)
       else:
         seq.append(3*x+1)
       x = seq[-1]
    return seq

这里有一些代码可以生成您正在寻找的内容。 1 的检查内置于 while 语句中,它迭代地附加到列表 seq

 >>> collatz_sequence(6)
[6, 3, 10, 5, 16, 8, 4, 2, 1]

请注意,对于大量数字列表,这将 非常 慢。缓存不会解决速度问题,并且您将无法在项目欧拉问题的强力解决方案中使用它,这将花费永远(因为它会进行每次计算,每次迭代。)

原文由 kreativitea 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题