質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

MacOS(OSX)

MacOSとは、Appleの開発していたGUI(グラフィカルユーザーインターフェース)を採用したオペレーションシステム(OS)です。Macintoshと共に、市場に出てGUIの普及に大きく貢献しました。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

4回答

2981閲覧

コラッツ数列のコードについて

Kyohei

総合スコア23

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

MacOS(OSX)

MacOSとは、Appleの開発していたGUI(グラフィカルユーザーインターフェース)を採用したオペレーションシステム(OS)です。Macintoshと共に、市場に出てGUIの普及に大きく貢献しました。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2018/09/30 15:33

環境: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ページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答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
hayataka2049

総合スコア30933

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Kyohei

2018/10/02 01:30

hayataka2049樣ありがとうございます。 書き方によってこれほど違うのですね。大変勉強になります! コードは極力シンプルに。を意識して書こうと思います☆
guest

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
LouiS0616

総合スコア35660

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Kyohei

2018/10/02 01:33

LouiS0616様ありがとうございます。 後者のコードは発想に全くありませんでした、非常に勉強になります☆
guest

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
katoy

総合スコア22324

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Kyohei

2018/10/02 01:29

katoy樣ありがとうございます。 「number を print した後に ==1 か? を判定するように」大変理解できました。 フローが頭の中でごちゃごちゃしていたようです。 プログラミングは英語に似ているなと思います。英語もプログラミングも「配置」の言語なのだと。 申し訳ありません、まだリストの勉強していなくてご提示くださったコードは追々に理解に努めさせていただきます。
guest

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

tiitoi

総合スコア21956

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Kyohei

2018/10/02 01:32

tiitoi様ありがとうございます。 //←初見でした。大変勉強になります!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問