Python Collatz猜想序列

Python Collatz猜想序列,python,Python,Collatz猜想 我想做的是: 编写一个名为collatz_sequence的函数,该函数接受一个起始整数并返回该数字的整数序列,包括起始点。以列表的形式返回序列。创建函数,以便如果用户输入任何小于1的整数,它将返回空列表[] collatz猜想的背景: 取任意自然数。如果n为偶数,则将其除以2得到n/2,如果n为奇数,则将其乘以3,再加1得到3n+1。无限期地重复这个过程。这个猜想是,不管你从什么数字开始,你最终都会达到1 到目前为止,我所拥有的: def collatz_sequence(

Collatz猜想

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

collatz猜想的背景:

取任意自然数。如果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
def collatz_序列(x):
seq=[x]
如果x<1:
返回[]
当x>1时:
如果x%2==0:
x=x/2
其他:
x=3*x+1
返回顺序

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

您忘记将
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
这里有一些代码,可以生成您要查找的内容。对
1
的检查内置于while语句中,并以迭代方式附加到列表
seq

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

注意,对于大的数字列表,这将非常缓慢。缓存无法解决速度问题,您也无法在project euler问题的强力解决方案中使用它,它将花费永远的时间(因为它会进行每次计算、每次迭代)。

还有另一种方法:

while True:
 x=int(input('ENTER NO.:'))
 print ('----------------')
 while x>0:
  if x%2==0:
   x = x/2
  elif x>1:
   x = 3*x + 1
  else:
   break
   print (x)
这将要求用户一次又一次地输入一个号码,直到他退出为止

def collatz(x):
    while x !=1:
        print(int(x))
        if x%2 == 0:
            x = x/2
        else:
            x = 3*x+1

这就是我的建议。

这给出了单个数字的所有步骤。它在0.3秒内使用了一个50位数的数字

seq = []
x = (int(input("Add number:")))
if (x != 1):
   print ("Number can't be 1")
while x > 1:
    if x % 2 == 0:
        x=x/2
    else:
        x = 3 * x + 1
    seq.append (x)
print seq
collatz = []

def collatz_sequence(x):
    while x != 1:
        if x % 2 == 0:
            x /= 2
        else:
            x = (3*x + 1)/2
        collatz.append(int(x))

    print(collatz)

collatz_sequence()
递归:

def collatz(n):
    if n == 1: return [n]
    elif n % 2 == 0: return [n] + collatz(int(n/2))
    else: return [n] + collatz(n*3+1)

print(collatz(27))

如果你经常这样做,这是记忆递归函数的理想候选。当我运行collarz_序列(6)时,现在我返回[6,3],我需要完整的序列,而不仅仅是值和序列中的第一个。序列应以最后一个数字1结束。所以6应该在列表中返回6,3,10,5,16,8,4,2,1。我想我的while循环现在有一个错误。@user1698174请将我的完整解决方案复制到您的程序中,然后重试。我已经测试过了,效果很好。我猜你的问题可能是因为缩进错误。很抱歉,我的一行字不合适,把它弄乱了。非常感谢你的帮助!!我不熟悉python和stackoverflow来发布我的视图。上次我没有编辑函数collataz的正确缩进。上面的程序以我的风格解决了collataz数字序列,我编写了代码。我知道它可以进一步简化。这不符合OP的要求。它不返回整数列表,事实上它返回
None
。你能解释一下你的代码是如何解决问题或改进问题中的代码的吗?你能给我们更多关于你答案的上下文吗?此链接将帮助您:
def collatz(x):
    while x !=1:
        print(int(x))
        if x%2 == 0:
            x = x/2
        else:
            x = 3*x+1
seq = []
x = (int(input("Add number:")))
if (x != 1):
   print ("Number can't be 1")
while x > 1:
    if x % 2 == 0:
        x=x/2
    else:
        x = 3 * x + 1
    seq.append (x)
print seq
collatz = []

def collatz_sequence(x):
    while x != 1:
        if x % 2 == 0:
            x /= 2
        else:
            x = (3*x + 1)/2
        collatz.append(int(x))

    print(collatz)

collatz_sequence()
def collatz(n):
    if n == 1: return [n]
    elif n % 2 == 0: return [n] + collatz(int(n/2))
    else: return [n] + collatz(n*3+1)

print(collatz(27))
steps=0
c0 = int(input("enter the value of c0="))

while c0>1:
    if c0 % 2 ==0 :
        c0 = c0/2
        print(int(c0))
        steps +=1
    else:
        c0 = (3 * c0) + 1
        print(int(c0))
        steps +=1
print("steps= ", steps)