2017-07-28 33 views
0

初學者問題在這裏。自動化無聊的任務 - 鍛鍊 - collat​​z功能

我剛剛嘗試從自動化無聊的東西練習。我已經按照以下格式完成了這個問題:首先定義一個函數,如下所示:

「寫一個名爲collat​​z()的函數有一個名爲number的參數,如果number是偶數,那麼collat​​z()應該打印number// 2並返回此值,如果數字爲奇數,則collat​​z()應打印並返回3 * number + 1。

,然後使用該相同的功能,滿足這些最小約束,編寫滿足以下要求的程序:

然後寫一個程序,讓用戶類型中的整數,並且,保持主叫在Collat​​z()直到函數返回值1.

我已經設法按照上面的規則生成一個以1結尾的數字序列,但是我的程序打印序列中的每個數字三次。有人能夠解釋爲什麼這可能是?

非常感謝您的幫助

def collatz(number): 
    if int(number) % 2 == 0: 
     print(int(number)//2) 
     return int(number)//2 
    else: 
     print(3 * int(number) + 1) 
     return 3 * int(number) + 1 

collatz(5)  
print('Enter a number') 

entry = input() 

while collatz(entry) != 1: 
    collatz(entry) 
    entry = collatz(entry) 
+0

因爲你調用該函數在三個不同的地點它打印了三次。 –

+0

您首先調用'collat​​z(5)',然後在每個'while'循環中調用它('collat​​z(entry)'),然後在循環內再調用它兩次。 – zwer

+0

爲了讓你的代碼看起來更好一些,'1'你不需要在每個實例上都做'int(number)',事實上,你可以假設'int'會被傳遞,並且擺脫你的所有'int()'。你也可以擺脫打印聲明,並使用'return' –

回答

2

你的循環應該是這樣的:

entry = input() 
while entry != 1: 
    entry = collatz(entry) 
+0

謝謝Błotosmętek。我改變了建議的循環,現在可以工作。然而,我仍然有些困惑。如果你能解釋爲什麼如果我運行該程序並在出現提示時輸入1,while循環仍然運行,即使條件爲假,我將非常感激。非常感謝 –

+0

我想我設法弄清楚了......我猜輸入最初是作爲一個字符串來評估的?我更改了代碼,如下所示,現在可以運行 - https://paste.ofcode.org/AF3kGHb28DxJAwY6LhSeE5 - 感謝您的幫助 –

0

您調用的函數3次,你必須在函數調用print

只調用函數一次,我會從collatz方法去除print語句,只是print在調用循環,例如:

In []: 
def collatz(number): 
    if number % 2 == 0: 
     return number//2 
    return 3*number + 1 

entry = int(input("Enter a number: ")) 
print(entry) 

while entry != 1: 
    entry = collatz(entry) 
    print(entry) 

Out[]: 
Enter a number: 10 
10 
5 
16 
8 
4 
2 
1