Python でのコラッツ シーケンス

Jay Shaw 2023年10月10日
  1. Collatz シーケンスの背後にあるプログラミング ロジック
  2. if-else を使用した Python の Collatz シーケンス
  3. while ループと例外処理を使用した Python の Collatz シーケンス
  4. 再帰を使用した Python の Collatz シーケンス
  5. while ループを使用した Python のコラッツ シーケンス
  6. まとめ
Python でのコラッツ シーケンス

コラッツ数列は、最終的に 1 になる数の数列です。数が特定の一連の操作を受けると、最後の桁は 1 にならなければならないと言われています。

この記事では、任意の数値について Python で collatz シーケンスを見つけるプログラムの作成方法について説明します。

Collatz シーケンスの背後にあるプログラミング ロジック

Python で特定の数値の collatz シーケンスを見つけるには、4つの操作に従う必要があります。

  1. 偶数か奇数かを調べる。
  2. 偶数の場合、プログラムは数値 n を 2 で割って出力します。
  3. 奇数の場合、プログラムは n に 3 を掛け、次に 1 を加えて出力します。
  4. プログラムは、数値 n が 1 に減少したかどうかをチェックします。 そうでない場合は、再度実行されます。

特定の数値 5 の場合、collatz シーケンスは - 16、8、4、2、1 になります。

次のセクションでは、Python で collatz シーケンスを表示するプログラムを作成する 4つの方法について説明します。

if-else を使用した Python の Collatz シーケンス

以下のプログラムは、Python で collatz シーケンスを見つけるための簡単な表現を示しています。 メソッド collatz_seq は、単一のパラメーター numb で作成されます。

このプログラムで使用されるロジックは、while ループ内で if-else ステートメントを使用します。 最初に、プログラムはメソッド collatz_seq 内で while ループを実行して、変数 numb 内の値が 1 かどうかをチェックします。

変数 numb が 1 でない場合、プログラムは if-else ステートメントを使用して、指定された数値が偶数か奇数かを調べるための 2 番目のチェックを実行します。 if ステートメント内で、プログラムは数値を 2 で割った余りが残っているかどうかをチェックします。

if numb % 2 == 0:
    pass

数値が偶数の場合、プログラムはそれを 2 で割って出力します。 数が奇数の場合、プログラムは numb % 2 == 1true である elif ステートメントに移行します。

変数 numb は 3 倍され、1 に加算されます。最後に、数値が出力されます。

if numb % 2 == 0:
    pass
elif numb % 2 == 1:
    numb = (numb * 3) + 1
    print(numb)

この一連のループは、numb の値が 1 に減少するまで数値のチェック、更新、出力の操作を実行し続け、numb の値が 1 として検出されると、while ループが終了します。

最後に、メソッド collatz_seq が呼び出され、引数の値として 5 が渡されます。

def collatz_seq(numb):
    while numb != 1:
        if numb % 2 == 0:
            numb = numb // 2
            print(numb)

        elif numb % 2 == 1:
            numb = (numb * 3) + 1
            print(numb)


collatz_seq(5)

これは、入力 = 5 に対する Python の collatz シーケンスを示しています。

16
8
4
2
1

while ループと例外処理を使用した Python の Collatz シーケンス

前の例では、与えられた数の collatz シーケンスを Python で出力するプログラムを示しました。 しかし、プログラムには、クラッシュにつながる可能性のある未解決の問題がたくさんあります。

たとえば、numb の値に文字列を指定すると、プログラムがクラッシュします。 同様に、負の整数を入力として指定すると、プログラムがクラッシュします。

プログラムには、入力されたデータをフィルタリングして解決するためのフェールセーフ手順が必要です。

この Python で collatz シーケンスを見つけるプログラムでは、ライブラリ パッケージ sys がインポートされます。 sys システム関数は、条件が満たされたときにプログラムを終了します。

メソッド collatz_seq は、前回のプログラムと同様にパラメーター numb で作成されます。

import sys
def collatz_seq(numb):

if-elif ステートメントは、数値が偶数か奇数かをチェックします。 数値が偶数の場合、数値は 2 で除算され、新しい数値が変数 value に格納されます。

数値が奇数の場合、変数 value には、それぞれ 3 と 1 を乗算および加算した値が格納されます。

if numb % 2 == 0:
    value = numb // 2
elif numb % 2 != 0:
    value = (3 * numb) + 1

前回のプログラムとは異なり、更新された結果は value 変数内に格納されます。 if-elif ブロックの後に、2つの while ループが作成されます。

最初の while ループは、変数 value の値が 1 かどうかをチェックし、ケースが true である場合は出力してループを終了します。 value1 でない場合、2 番目の while ループは value を出力し、変数 numb 内にコピーします。

while value == 1:
    print(value)
    sys.exit()

while value != 1:
    print(value)
    n = value

最後に、メソッド collatz_seq が引数 numb で再帰的に呼び出されます。 このメソッドは、value1 に減少するまで自分自身を呼び出し続けます。その後、プログラムは sys.exit() 関数を使用して終了します。

return collatz_seq(numb)

メソッド collatz_seq の外で、ユーザー入力を受け取る変数 number が作成されます。 無効な入力をキャッチするために、例外処理ブロックが追加されています。

try ブロック内では、変数 number は整数入力として取得されます。 if ステートメントを使用して、数値が負かどうかを確認します。

true が見つかった場合、数値の極性が変更され、適切なメッセージが出力されます。 最後に、メソッド collatz_seq が呼び出されます。

print('Enter a number: ')
try:
    number = int(input())
    if number < 0:
        number = abs(number)
        print("A negative number entered")
    collatz_seq(number)

except ブロック内では、エラー メッセージと共に、整数以外の入力に対して ValueError が発生します。

except ValueError:
    print('You must enter an integer type.')

完全なコードを以下に示します。

import sys


def collatz_seq(numb):
    if numb % 2 == 0:  # Remainder = 0, Checks for even number
        value = numb // 2
    elif numb % 2 != 0:  # Remainder = 1, Checks for odd number
        value = (numb * 3) + 1

    while value == 1:  # If value is 1
        print(value)
        sys.exit()  # Program exits

    while value != 1:  # The loop runs until the value is not 1.
        print(value)
        numb = value  # Value of value is copied to numb
        return collatz_seq(numb)


print("Enter a number: ")  # Input statement
try:
    number = int(input())  # Typecast as Integer Input
    if number < 0:
        number = abs(number)
        print("A negative number entered")
    collatz_seq(number)
except ValueError:
    print("You must enter an integer type.")

出力:

Enter a number:
10
5
16
8
4
2
1

無効な入力の場合:

Enter a number:
j
You must enter an integer type.

再帰を使用した Python の Collatz シーケンス

このプログラムは、別のメソッド呼び出しを使用して、Python で collatz シーケンスを見つけます。 with ブロックは collatz メソッドの外で作成され、プログラムが指定された回数だけ入力を取り続けることができるようにします。

collatz メソッドは、数値が偶数か奇数かをチェックし、前のプログラムと同様に演算を実行します。 メソッドの外では、プログラムは 2つの入力を受け取ります。 最初は for ループの範囲を取ります。

try ブロック内で、2 番目の入力が提供されます。 while ループは、numb の値が 1 に減少するまでメソッド collatz を呼び出し続けます。

while ループ内では、numb の値が繰り返し渡され、返されます。

def collatz_seq(numb):
    if numb % 2 == 0:  # even
        print(numb // 2)
        return numb // 2
    elif numb % 2 != 0:  # odd
        value = 3 * numb + 1
        print(value)
        return value


c = int(input("Enter count: "))
for c in range(c):
    try:
        n = input("Enter number: ")
        while n != 1:
            n = collatz_seq(int(n))
    except ValueError:
        print("Value Error. Please enter integer.")

出力:

Enter count: 2
Enter number: 5
16
8
4
2
1
Enter number: 6
3
10
5
16
8
4
2
1

while ループを使用した Python のコラッツ シーケンス

これまでのところ、Python で特定の数値の collatz シーケンスを出力するプログラムの作成方法を学びました。 このプログラムでは、プログラムが結果を 1 に減らすのにかかった反復回数も計算しました。

メソッド solve はパラメーター numb で作成されます。 if ステートメント内では、パラメーターに値 = 0 が指定されている場合、プログラムは 0 を返します。

新しい変数 length が作成され、反復回数をカウントするために使用されます。

変数 length が作成され、1 が割り当てられます。 while ループは、終了条件 numb != 1 で作成されます。 これにより、numb の値が 1 になるまでループが実行され続けます。

while ループ内では、numb の操作が 1つのステートメントで実行されます。 numb は、偶数の場合は 2 で除算され、偶数の場合は (3 * numb + 1) で除算されます。

length の値が反復ごとに更新されるように、操作は単一のステートメントで実行されます。

numb = (numb / 2) if numb % 2 == 0 else (3 * numb + 1)

numblength の現在の値が出力され、length1 ずつインクリメントされます。 プログラムは偶数か奇数かをチェックし、numb を更新して、それを出力します。

次に、次の操作のために length がインクリメントされます。

最後のステップで、プログラムは余分な 1length にインクリメントします。 この余分な数が減算され、length の最終カウントが返されます。

最後に、メソッド solve が呼び出され、引数 10 が渡され、結果が出力されます。

def solve(numb):
    if numb == 0:
        return 0
    length = 1
    while numb != 1:
        numb = (numb / 2) if numb % 2 == 0 else (3 * numb + 1)
        print("Count = ", length, "Value = ", numb)
        length += 1
    return length - 1


print("Total iterations = ", solve(10))

出力:

Count =  1 Value =  5.0
Count =  2 Value =  16.0
Count =  3 Value =  8.0
Count =  4 Value =  4.0
Count =  5 Value =  2.0
Count =  6 Value =  1.0
Total iterations =  6

まとめ

この記事では、Python で collatz シーケンスを表示するプログラムを作成するさまざまな例を紹介します。 この記事を読んだ後、読者は複数の方法で Python で collatz シーケンスを作成できます。

関連記事 - Python Sequence