2017-12-19 12 views
1

次の宿題に関する質問を解読しようとしています。私のコードは190に評価されるはずですが、代わりに114に評価されます。したがって、私はコーディング要件を理解しているとは思いません。Pythonで目標としているCollat​​z予想の理解

このCollat​​z予想は 行動世界最高 数学者はまだそれを理解していないように予測不可能である、単純な計算処理の一例です。

nが奇数の場合、整数nを取り、n場合2でそれを分割する単純な関数f(n)(上記Wikipediaのページ で定義されている)にも及び 乗算3によってnと、結果に1を加算され、検討します。 は、関数f への呼び出し回数が増えるにつれて、式 f(f(f(...f(f(n)))))の式の値を調べることになります。予想は任意の非負の整数nため、nからfの 繰り返しアプリケーションは は常にこの質問1.

あなたの仕事は PythonでこのCollat​​z機能fを実装することである含ん整数のシーケンスを生成する、ということです。実装の鍵は がnが偶数であるか奇数であるかを、を2で割った剰余が0か1のいずれかであるかどうかを調べることによって決定するというテストを構築することです。ヒント:残りのオペレータ%を の式n % 2で使用して、この残りの部分をPythonで として計算できます。 fを計算する場合は、整数除算// も使用する必要があります。

fを実装したら、実装を の式f(f(f(f(f(f(f(674)))))))でテストしてください。この式は、 〜190と評価されます。

from __future__ import division 


def collatz(n): 
    l = [] 
    l.append(n) 
    while n != 1: 

     if n % 2 == 0: 
      n = n // 2 
      l.append(n) 

     else: 
      n = (3*n) + 1 
      l.append(n) 
    return l 


print len(collatz(674)) 
+0

あなたは 'F'が、全く異なる(関連が)機能を実装していません。 'f'はシーケンス全体ではなく、シーケンス内の次の項を計算しなければなりません。 –

答えて

2

ちょうど中間の質問を読み違えます。あなたのプログラムは、これは190を返すべきである...大きな疑問に答えるためにしようとします:

def f(n): 
    return n // 2 if n % 2 == 0 else 3*n + 1 


print f(f(f(f(f(f(f(674))))))) 
+0

ありがとうジュリアン。とった! – charlie

関連する問題