0

コラッツ数列を使用して、数値がいつゼロになるかを計算するプログラムを作成しようとしています。そのプログラムの私のコードは次のとおりです。

import time

def run(z):
    while z != 1:
        if isEven(z) == True:
            z = z/2
            print z
        else:
            z = (3*z)+1
            print z
    else:
        print 'Got one!'
        z = z+1
        print 'Trying for %d...' %(z)
        time.sleep(0.1)
        run(z)



def isEven(number):
        return number % 2 == 0

run(z)

ただし、zが 2 を超えることはなく、印刷を続けるだけです。

Got one!
Trying for 2...
1
Got one!
Trying for 2...
1

など...誰かが私が間違っていることを教えてもらえますか?

4

2 に答える 2

1

コラッツ予想では、ゼロではなく 1 に到達します。1つに達したら、停止する必要があります。whileまた、ループと再帰呼び出しの奇妙な組み合わせがあります。非常に単純な再帰的な実装:

def collatz(n):
    print(n)
    if n == 1: # base case
        print("Done!")
    else:
        if n % 2: # odd number
            collatz((3 * n) + 1)
        else: # even number
            collatz(n / 2)

または反復バージョン:

def collatz(n):
    while n != 1:
        print(n)
        if n % 2: # odd number
            n = (3 * n) + 1
        else: # even number
            n /= 2
    print(n)
    print("Done!")

数値が 1 に達するまでにかかる時間を分析したい場合は、これらの実装の 1 つを再調整できます。

def collatz(n):
    count = 0
    while n != 1:
        count += 1
        if n % 2: # odd number
            n = (3 * n) + 1
        else: # even number
            n /= 2
    return count

次に、この関数を呼び出して、整数を処理し、それぞれのコラッツ シーケンスを作成します。次に例を示します。

seq_len = [(n, collatz(n)) for n in range(1, 101)]
于 2014-01-26T00:15:30.880 に答える
1

z が 1 になると、whileループを終了しelse、 を呼び出しrun(2)、 を呼び出し、 z を 1 に戻して、 を呼び出しますrun(2)

于 2014-01-26T00:10:16.033 に答える