2016-06-17 6 views
1

私は、Pythonで退屈なものを自動化する第3章の練習プロジェクトを使用してCollat​​zシーケンスプログラムを書いています。Collat​​zシーケンスは4で終了する

プログラムの概要は次のとおりです。

numberという名前のパラメータを持っていcollatz()という名前の関数を記述します。

numberが偶数の場合、collatz()number // 2を出力し、 をこの値に戻す必要があります。 numberが奇数の場合、collatz()が印刷され、 3 * number + 1が返されます。

は次に整数でユーザータイプをすることができますプログラムを書いて、その 機能は 値1を返すまで、その数にcollatz()を呼び出し続けます。

私のコードは、しかし、それは私が、出力が1過去のバック4.

出力例に戻り、これまでにしようとしているすべての番号には4ではなく1で停止し動作します:私は

6,3,10,5,16,8,4,2,1,4 

pythonに3.4.2

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


print ("pick a number:") 

while True: 
try: 
    number = int(input()) 
    while number != 1: 
      number = collatz(number) 
    collatz(number) 
    break 
except ValueError: 
     print("Error: Please enter a valid integer") 
print("Magic! You are down to 1.") 
+0

'collat​​zの(数)' '再びwhile'ループの外。 「1」は奇数であり、「3 * 1 + 1 == 4」 – jonrsharpe

答えて

1

を使用しています問題は、ループをWiを終了した後、あなたがもう一度collatz()を呼び出すことですth 1.その行を削除するだけで正常に動作します。

また、関数をinput関数に移動すると、質問の後に新しい行が表示されなくなり、無効な値を入力したときに毎回尋ねられます。

また、無限ループを避けるために、数値が1以上であるかどうかを確認する必要があります。すべてのことを行うコードは、次のようになります。

あなたが呼び出す
while True: 
    try: 
     number = int(input("pick a number: ")) 
     if number < 1: 
      print("Error: Please enter a integer greater than or equal to 1 ") 
      continue 

     while number != 1: 
       number = collatz(number) 
     # removed the additional call to collatz 
     break 
    except ValueError: 
      print("Error: Please enter a valid integer") 
print("Magic! You are down to 1.") 
0
def collatz(number): 
    number = number // 2 if number % 2 == 0 else 3 * number + 1 
    print(number) 
    return number 

number = int(input("Pick a Number\n")) 

while number != 1: 
    number = collatz(number) 
print("Magic! You are down to 1.") 
関連する問題