🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Python

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

Q&A

解決済

1回答

459閲覧

無限ループからぬけ出せない

GIOGIO

総合スコア23

Python

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

0グッド

0クリップ

投稿2020/12/14 15:04

編集2020/12/14 15:06

構文は間違っていないはずなのにwhile文から抜け出せなくなり無限ループしてしまいます。
なぜでしょうか?

python

1def rule1(word_list, v): 2 return v in word_list 3 4def rule2(v, before_word, pass_rule2): 5 return pass_rule2 or before_word[-1] == log[0] 6 7def rule3(current_log, v): 8 return not v in current_log 9 10def rule4(v): 11 return v[-1] != "z" 12 13n, k, m = map(int, input().split()) 14word_list = [] 15log = [] 16 17for _ in range(k): 18 word_list.append(input()) 19 20for _ in range(m): 21 log.append(input()) 22 23alive = [True] * n 24current_log = [] 25 26now_number = 0 27pass_rule2 = True 28for i, v in enumerate(log): 29 30 # ここから抜け出せなくなる 31 while True: 32 if now_number >= len(alive): 33 now_number = 0 34 if alive[now_number]: 35 break 36 now_number += 1 37 38 if rule1(word_list, v) and rule2(v, log[i-1], pass_rule2) and rule3(current_log, v) and rule4(v): 39 pass_rule2 = False 40 else: 41 alive[now_number] = False 42 pass_rule2 = True 43 44 current_log.append(v) 45 now_number += 1 46 47print(sum(alive)) 48for i, v in enumerate(alive, start=1): 49 if v: 50 print(i)

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

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

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

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

guest

回答1

0

ベストアンサー

アルゴリズムがおかしいからです。

なお、渡すデータ如何ではプログラムは正常に終了します。
ちゃんと検証してから質問した方が良いです。
もし検証した上で質問しているとしたら提供する情報が足りません。

また根本的な話ですが、
なぜ無限ループになるかの原因を論理的に考えるべきです。
本件、あまりにも原因が明確なので、自身で考える前に質問したのだろうと思います。

構文云々は関係ないです。
構文がおかしければ多分エラーになるでしょう。

一見すれば分かることですが、
無限ループになる条件はただ一つ。

「alive のすべての要素が False になる」

だけです。
逆にそれ以外の要因が考慮されないので、
すぐに原因は分かるはずですが。

例えば、
3 3 3
a
b
c
1
2
3
のデータを渡したときは正常にプログラムが終了します。

しかし、
2 3 3
a
b
c
1
2
3
のデータを渡したときは無限ループに陥ります。

分かりやすい例を挙げたつもりですので、
上記2つのサンプルで検証すれば無限ループの原因は分かると思います。

投稿2020/12/14 21:29

編集2020/12/14 21:31
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問