Collatz猜想
我想要做的是:编写一个名为collatz_sequence的函数,该函数接受一个起始整数,并返回该数字的整数序列,包括起始点。以列表的形式返回序列。创建您的函数,以便如果用户输入任何小于1的整数,它将返回空的list []。
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。
发布于 2012-11-14 02:52: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-14 03:39:56
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这里有一些代码可以产生你想要的东西。while语句中内置了对1的检查,它会迭代地附加到列表seq中。
>>> collatz_sequence(6)
[6, 3, 10, 5, 16, 8, 4, 2, 1]请注意,对于大的数字列表,这将非常慢。缓存不会解决速度问题,您也不能在项目euler问题的暴力解决方案中使用它,它将永远花费时间(因为它会进行每一次计算,每一次迭代)。
发布于 2016-09-10 19:36:39
这是另一种方法:
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)这将要求用户一次又一次地输入一个数字,直到他退出
https://stackoverflow.com/questions/13366830
复制相似问题