7

柯拉兹猜想

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

考拉兹猜想的背景:

取任意自然数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。

4

11 回答 11

12

您忘记将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]
于 2012-11-13T18:52:12.213 回答
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

这是一些产生您正在寻找的东西的代码。检查1是内置在 while 语句中的,它会迭代地附加到 list 中seq

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

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

于 2012-11-13T19:39:55.780 回答
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
于 2017-08-01T02:09:19.280 回答
0
import numpy as np
from matplotlib.pyplot import step, xlim, ylim, show

def collatz_sequence(N):  
  seq = [N]
  m = 0
  maxN = 0
  while seq[-1] > 1:
     if N % 2 == 0:
       k = N//2
       seq.append(N//2)
       if k > maxN:
         maxN = k
     else:
       k = 3*N+1
       seq.append(3*N+1)
       if k > maxN:
         maxN = k
     N = seq[-1]
     m = m + 1
  print(seq)

  x = np.arange(0, m+1)
  y = np.array(seq)
  xlim(0, m+1)
  ylim(0, maxN*1.1)
  step(x, y)
  show()

def collatz_exec():
  print('Enter an Integer')
  N = int(input())
  collatz_sequence(N)

这是您可以使用它的方式:

>>> from collatz_sequence import *
>>> collatz_exec()
Enter an Integer
21
[21, 64, 32, 16, 8, 4, 2, 1]

还有一个显示序列的图:

在此处输入图像描述

于 2022-02-27T18:02:35.500 回答
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()
于 2020-01-21T18:30:33.587 回答
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)
于 2021-01-05T13:24:09.333 回答
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))
于 2020-04-16T04:53:38.397 回答
0
def collatz(x):
    while x !=1:
        print(int(x))
        if x%2 == 0:
            x = x/2
        else:
            x = 3*x+1

这就是我的建议..

于 2016-10-02T10:21:07.647 回答
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)

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

于 2016-09-10T11:36:38.570 回答
-1
seq = []

def collatz_sequence(x):
    global seq
    seq.append(x)
    if x == 1:
        return 
    if (x % 2) == 0:
        collatz_sequence(x / 2)
    else:
        collatz_sequence((x * 3) + 1)

collatz_sequence(217)
print seq
于 2015-06-20T19:50:10.427 回答
-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)
于 2015-09-23T05:46:56.187 回答