2016-04-27 11 views
1

Collatz推測で1に戻るまでのステップ数を測定するコードを作成しました。ここに私のコードは、私が最終2つの印刷は、代わりに311と311を印刷するためのコマンド、彼らは私が間違っているどのようなコードで表示するのは簡単だったと思います311と622を印刷する期待新しい再帰ごとにCollat​​zカウンタをリセットする

counter = 0 
def collatz(n): 
    global counter 
    counter += 1 
    if n <= 0 : 
     return "Invalid Number" 
    elif n == 1 : 
     return counter 
    elif n % 2 == 1 : 
     n = 3*n + 1 
     return collatz(n) 
    elif n % 2 == 0 : 
     n = n/2 
     return collatz(n) 
print(collatz(9921615699)) 
print(collatz(9921615699)) 

です。どうすれば修正できますか?コマンドが完了するたびにリセットされ、関数が実行されているときはリセットされません。

答えて

4

代わりのグローバル変数を使用して、あなたはカウンターにデフォルト値を持つパラメータ作ることができます:

def collatz(n, counter=0): 
    counter += 1 
    if n <= 0 : 
     return "Invalid Number" 
    elif n == 1 : 
     return counter 
    elif n % 2 == 1 : 
     n = 3*n + 1 
     return collatz(n, counter) 
    elif n % 2 == 0 : 
     n = n/2 
     return collatz(n, counter) 
+0

それをやりました。ありがとう!早くAnsとしてマークしよう –

1

あなたは再帰を使用しているので、ちょうどそれを適切に使用します。

def collatz(n, counter=0): 
    counter += 1 
    if n <= 0 : 
     return "Invalid Number" 
    elif n == 1 : 
     return counter 
    elif n % 2 == 1 : 
     n = 3*n + 1 
     return collatz(n, counter) 
    elif n % 2 == 0 : 
     n = n/2 
     return collatz(n, counter) 
print(collatz(9921615699)) 
print(collatz(9921615699)) 

をあなたが何をしたいのか通常ではありません、あなたの元のバージョンでglobalを使用していました。なぜあなたは最初の手を見なければなりません。

お客様は、カウンタをリセットしました。

result = counter 
counter = 0 
return result 

これはかなり厄介ですが、そうしないでください。再帰的アルゴリズムを実装しているときには、おそらくグローバル変数を持つ正当な理由はありません。

関連する問題