Collat​​z猜想序列

时间:2012-11-13 18:50:17

标签: 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

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

10 个答案:

答案 0 :(得分:9)

您忘了将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]

答案 1 :(得分:3)

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]

注意,对于大型数字列表,这将非常慢。缓存不能解决速度问题,你将无法在项目欧拉问题的暴力解决方案中使用它,它将永远需要(因为每次计算,每次迭代都会这样做。)

答案 2 :(得分:0)

这是另一种方法:

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)

这将要求用户一次又一次地输入一个号码,直到他退出

答案 3 :(得分:0)

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

这就是我的建议......

答案 4 :(得分:0)

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

答案 5 :(得分:0)

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

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()

答案 6 :(得分:0)

递归:

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))

答案 7 :(得分:0)

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)

答案 8 :(得分:-1)

START "" /d "\\server\path\folder" "\\server\path\folder\file.exe" "http://google.com"

答案 9 :(得分:-1)

def collataz(number):
    while number > 1:
        if number % 2 == 0 :
            number = number //2
            print(number)
        elif number % 2 ==1 :
            number = 3 * number + 1
            print(number)
        if number == 1 :
            break

print('enter any number...!')
number=int(input())
collataz(number)