Python でのコラッツ シーケンス
- Collatz シーケンスの背後にあるプログラミング ロジック
-
if-else
を使用した Python の Collatz シーケンス -
while
ループと例外処理を使用した Python の Collatz シーケンス - 再帰を使用した Python の Collatz シーケンス
-
while
ループを使用した Python のコラッツ シーケンス - まとめ
コラッツ数列は、最終的に 1 になる数の数列です。数が特定の一連の操作を受けると、最後の桁は 1 にならなければならないと言われています。
この記事では、任意の数値について Python で collatz シーケンスを見つけるプログラムの作成方法について説明します。
Collatz シーケンスの背後にあるプログラミング ロジック
Python で特定の数値の collatz シーケンスを見つけるには、4つの操作に従う必要があります。
- 偶数か奇数かを調べる。
- 偶数の場合、プログラムは数値
n
を 2 で割って出力します。 - 奇数の場合、プログラムは
n
に 3 を掛け、次に 1 を加えて出力します。 - プログラムは、数値
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 == 1
が true
である 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
である場合は出力してループを終了します。 value
が 1
でない場合、2 番目の while
ループは value
を出力し、変数 numb
内にコピーします。
while value == 1:
print(value)
sys.exit()
while value != 1:
print(value)
n = value
最後に、メソッド collatz_seq
が引数 numb
で再帰的に呼び出されます。 このメソッドは、value
が 1
に減少するまで自分自身を呼び出し続けます。その後、プログラムは 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)
numb
と length
の現在の値が出力され、length
が 1
ずつインクリメントされます。 プログラムは偶数か奇数かをチェックし、numb
を更新して、それを出力します。
次に、次の操作のために length
がインクリメントされます。
最後のステップで、プログラムは余分な 1
を length
にインクリメントします。 この余分な数が減算され、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 シーケンスを作成できます。