2012-11-13 66 views
3

的考拉茲猜想考拉茲猜想序列

什麼,我試圖做的: 編寫一個叫做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時,我只能得到該數字,即collat​​z_sequence(6)返回[6]。我需要這個返回整個數字序列,所以6應該返回列表中的6,3,10,5,16,8,4,2,1。

+1

如果你這樣做了很多,這是一個memoized遞歸函數的理想人選。 – kreativitea

回答

8

你忘了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] 
+0

當我運行collarz_sequence(6)現在我返回[6,3]我需要完整的序列不只是價值和序列中的第一個。該序列應該終止最後的數字是1.所以6應該在列表中返回6,3,10,5,16,8,4,2,1。我認爲我的while循環現在有一個錯誤。 – user1698174

+0

@ user1698174請將我的完整解決方案複製到您的程序中,然後重試。我測試過它,它工作。我猜你的問題可能是由於錯誤的縮進。 –

+0

對不起,我有一個不合時宜的地方,它搞砸了。十分感謝你的幫助!! – user1698174

2
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] 

注意,這將是對數字的大名單很慢。一個緩存不會解決速度問題,並且你將無法在項目euler問題的蠻力解決方案中使用它,它將永遠佔用(因爲它會進行每次計算,每次迭代。)

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

我是新來的python和stackoverflow發佈我views.last時間我不編輯正確的縮進功能collat​​az。 – ShivaGuntuku

+0

上面的程序解決了我編寫代碼的collat​​az序列號。我知道它可以進一步簡化完成。 – ShivaGuntuku

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) 

這將一次又一次地問了許多用戶放在它,直到他退出

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

這是我的建議..

+0

這不符合OP的要求。它不返回一個整數列表,實際上它返回'None'。 –

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 
+0

您能否解釋您的代碼如何以及爲什麼解決問題或改進問題中的代碼? –