首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Collatz猜想序列

Collatz猜想序列
EN

Stack Overflow用户
提问于 2012-11-14 02:50:17
回答 11查看 35K关注 0票数 7

Collatz猜想

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

collatz猜想的背景:

取任意自然数n。如果n是偶数,则将其除以2得到n/2;如果n是奇数,则将其乘以3,再加1,得到3n +1。无限重复这一过程。这个猜想是,无论你从哪个数字开始,你最终都会达到1。

到目前为止,我所拥有的:

代码语言:javascript
复制
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。

EN

回答 11

Stack Overflow用户

回答已采纳

发布于 2012-11-14 02:52:12

您忘记将x值附加到seq列表中:

代码语言:javascript
复制
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

验证:

代码语言:javascript
复制
~/tmp$ python collatz.py 
[6, 3, 10, 5, 16, 8, 4, 2, 1]
票数 12
EN

Stack Overflow用户

发布于 2012-11-14 03:39:56

代码语言:javascript
复制
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中。

代码语言:javascript
复制
>>> collatz_sequence(6)
[6, 3, 10, 5, 16, 8, 4, 2, 1]

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

票数 5
EN

Stack Overflow用户

发布于 2016-09-10 19:36:39

这是另一种方法:

代码语言:javascript
复制
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)

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13366830

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档