Collat​​z猜想序列

use*_*174 6 python

Collat​​z猜想

我要做的是:写一个名为collat​​z_sequence的函数,它接受一个起始整数并返回该数字的整数序列,包括起始点.以列表的形式返回序列.创建函数,以便在用户输入任何小于1的整数时,返回空列表[].

关于collat​​z猜想的背景:

取任何自然数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
Run Code Online (Sandbox Code Playgroud)

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

Lau*_*low 10

您忘记将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
Run Code Online (Sandbox Code Playgroud)

验证:

~/tmp$ python collatz.py 
[6, 3, 10, 5, 16, 8, 4, 2, 1]
Run Code Online (Sandbox Code Playgroud)


kre*_*tea 5

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
Run Code Online (Sandbox Code Playgroud)

这里有一些代码可以产生你正在寻找的东西。检查1内置于 while 语句中,并迭代地附加到列表中seq

>>> collatz_sequence(6)
[6, 3, 10, 5, 16, 8, 4, 2, 1]
Run Code Online (Sandbox Code Playgroud)

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