環境:Mac OS,Python3系
コラッツ数列のコードを下記のように書いてRUNしましたが最後に「1」が表示されません。
どうすれば「1」と表示できるようになるかご教授ください。
また、皆様ならこうコードを書くといった例となるコードを提示していただければ幸いです。
def collatz(number): if number % 2 == 0: return int(number / 2) elif number % 2 == 1: return int(3 * number + 1) print('整数を入力してください。') number = int(input()) while collatz(number) != 1: collatz(number) number = collatz(number) print(number)
RUN後↓(例えば「3」入力なら、、、
3
10
5
16
8
4
2
と表示され、最後に「1」が表示されません。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答4件
0
なにせ条件式がnumber != 1
なので、ループを抜けてしまいますね。
この問題のロジックはdo while
とか代入式があれば書きやすいのですが、どちらも現在のpythonにはありません。
LouiS0616さんのように無限ループにするのが比較的スマートでわかりやすい方法です。
python
1while True: 2 number = collatz(number) 3 print(number) 4 5 if number == 1: 6 break
他にあまりうまい手はないと思うので、私ならこれで済ませるかな・・・
その他雑多な改善を施したコード。
python
1def collatz(number): 2 if number % 2 == 0: 3 return number // 2 # 整数の商 4 else: # elseで良い 5 return 3 * number + 1 # // intは不要では? 6 7number = int(input("整数を入力してください\n")) # inputの引数に文字列を渡すとpromptを出してくれる(今回は改行するのでメリットがあるかは微妙。printでもいい) 8while True: 9 number = collatz(number) 10 print(number) 11 12 if number == 1: 13 break
投稿2018/09/30 16:03
編集2018/09/30 23:42総合スコア30933
0
何回もcollatz関数を呼ぶのは無駄なので、私ならこう書きます。
Python
1print(number) 2while number != 1: 3 number = collatz(number) 4 print(number)
あるいは次のように無限ループにします。
Python
1while True: 2 print(number) 3 number = collatz(number) 4 5 if number == 1: 6 break 7 8print(1)
ただし後者の場合、入力として1が与えられたときは期待通りに動作しません。
投稿2018/09/30 15:40
編集2018/09/30 15:52総合スコア35660
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
ベストアンサー
python3
1def collatz(number): 2 if number % 2 == 0: 3 return int(number / 2) 4 else: 5 return int(3 * number + 1) 6 7print('整数を入力してください。') 8number = int(input()) 9 10while True: 11 print(number) 12 if number == 1: 13 break 14 number = collatz(number)
while のなかでは、 1 度だけ collatz メソッドを呼ぶようになっているべきです。
また、number を print した後に ==1 か? を判定するようにしないと1 は print されません。
while True をつかうのが嫌なら、こんなふうにする案もあります。
python3
1def collatz(number): 2 if number % 2 == 0: 3 return int(number / 2) 4 else: 5 return int(3 * number + 1) 6 7def calc_and_print(number): 8 ret = collatz(number) 9 print(ret) 10 return ret 11 12print('整数を入力してください。') 13number = int(input()) 14 15while number != 1: 16 number = calc_and_print(number)
計算と print を行うことを1つのメソッドにまとめてしまえば、確実に数列の値は確実に表示されます。
追記:
ループのなかで 数列の計算と print をするから、いろいろと混乱するのです。
数列の生成を generator にして、 ループ本体を print だけにするとスッキリします。
c_gen.py
python3
1def collatz(number): 2 while True: 3 yield number 4 if number == 1: 5 return None 6 7 if number % 2 == 0: 8 number = int(number / 2) 9 else: 10 number = int(3 * number + 1) 11 12for i in collatz(int(input("整数を入力してください。:"))): 13 print(i) 14 15# for i in range(1, 100): 16# nums = [x for x in collatz(i)] 17# print(i, ":", nums)
投稿2018/09/30 16:27
編集2018/10/01 14:17総合スコア22324
0
最後に1が表示されない原因
collatz(number) の返り値が1になった時点で、collatz(number) != 1
が False になり、print() する前に while ループを抜けてしまうからです。
Tips
Python 3 では、 // を使うと、整数同士の演算で商を計算できます。
print(5 / 2) # 2.5 (float型) print(5 // 2) # 2 (int型)が
サンプルコード
python
1def collatz(number): 2 if number % 2 == 0: # 偶数 3 return number // 2 4 elif number % 2 == 1: # 奇数 5 return 3 * number + 1 6 7print('整数を入力してください: ', end='') 8number = int(input()) 9 10while True: 11 number = collatz(number) 12 print(number, end=' ') 13 14 if number == 1: 15 break
整数を入力してください: 10 5 16 8 4 2 1
投稿2018/09/30 15:46
総合スコア21956
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/10/02 01:30