2016-09-29 113 views
0

我想從'自動化枯燥的東西與Python書',但已遇到一些問題編寫collat​​z程序。我正在使用python 3.5.2。以下是項目大綱:使用while循環和變量

編寫一個名爲collat​​z()的函數,該函數有一個名爲number的參數。如果數字是偶數,那麼collat​​z()應該打印數字// 2並返回該值。如果數字是奇數,那麼collat​​z()應該打印並返回3 *數字+1。然後編寫一個程序,讓用戶鍵入一個整數,並不斷調用該數字的collat​​z(),直到函數返回值1爲止。

我的代碼:

def collatz(number): 
    if number % 2 == 0:  #its even 
     print(number // 2) 
     return number // 2 
    elif number % 2 == 1: #its odd 
     print(3*number+1) 
     return 3*number+1 


print('Type an integer: ') 
num=int(input()) 

while(True): 
    if collatz(num) == 1: 
     break 

# Or even simpler: 
# while(collatz(num) != 1): 
#  pass 

輸出給了我一個無限循環:

Type an integer: 
10 
5 
5 
5 
5 
5 
5 
5 
5 
... 

但是,當我打破它,並使用一個變量來存儲返回值,它的工作原理:

while(True): 
    num=collatz(num) 
    if num == 1: 
     break 

輸出:

Type an integer: 
5 
16 
8 
4 
2 
1 

爲什麼呢?我不明白爲什麼第一個程序不起作用。兩者都是相似的,但我只是選擇直接在我的原始程序中測試返回值,而不是使用變量。 我很感激任何幫助,謝謝。

+6

你的無限循環版本永遠不會更新'num'的值。 – Blorgbeard

+1

那麼這是我的一個非常愚蠢的錯誤。好吧,它發生..謝謝你。 – tadm123

回答

2

您的代碼:

while(True): 
    if collatz(num) == 1: 
     break 

沒有工作,因爲每次collatz被調用時,被稱爲與NUM的值相同,因此一次又一次地返回相同的號碼。這個數字不是1,所以你有一個無限循環。

當你做num = collatz(num)時,num的值在第一次調用該函數時被改變。然後將新值傳遞給函數第二次調用,等等。所以最終當num的值變爲1並退出循環時達到一個點。

+0

請考慮不回答問題,歸結爲錯字級問題和[可在評論中回答](http://stackoverflow.com/questions/39780993/using-while-loops-and-variables#comment66856127_39780993)。這些問題對未來的讀者沒有任何幫助,但提供完整的答案可能會阻礙自動刪除過程,並長期影響Stack Overflow。 –

+0

@AndrasDeak我不知道我們如何在這裏定義錯字級問題。你能指點我一些指導方針嗎? 從我看到OP有問題了解他的代碼的邏輯。對於有經驗的程序員來說,這是微不足道的,但對於初學者來說可能並不一樣。他犯的錯誤不是拼寫錯誤,而是代碼中的錯誤。 – xuanluong

+1

你是對的,我傾向於認爲錯別字與具有一百重複的非常基本的錯誤屬於同一類別:)下面是來自與錯字類問題相對應的緊密原因的文本:「*這個問題是由一個問題引起的不再被複制或者是一個簡單的印刷錯誤,雖然類似的問題可能會在這裏討論,但這個問題的解決方式不可能對未來的讀者有所幫助[...] *「。我的意思是第二句話的精神。我相信你的答案是好的,你可以保留它。只是想在未來考慮這方面:) –