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

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

新規登録して質問してみよう
ただいま回答率
85.50%
while

Whileは多くの言語で使われるコントロール構造であり、特定の条件が満たされる限り一連の命令を繰り返し実行します。

ループ

ループとは、プログラミングにおいて、条件に合致している間、複数回繰り返し実行される箇所や、その制御構造を指します

Python

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

Q&A

解決済

4回答

1339閲覧

「無限ループの状態」そのものをIF文の条件にはできないのか?

退会済みユーザー

退会済みユーザー

総合スコア0

while

Whileは多くの言語で使われるコントロール構造であり、特定の条件が満たされる限り一連の命令を繰り返し実行します。

ループ

ループとは、プログラミングにおいて、条件に合致している間、複数回繰り返し実行される箇所や、その制御構造を指します

Python

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

0グッド

1クリップ

投稿2020/05/02 07:42

編集2020/05/02 07:43

前提・実現したいこと

素朴な疑問なんですが、無限ループを処理する方法は「処理時間が〇〇秒を越した時にbreak」以外に存在しますか?

Pythonを使って、ある問題でwhileの無限ループの処理を「処理時間が10秒を超えたらbreak」を再現するために以下のような条件付をして回しました。
ただ、自分としては「無限である」ということそのものを条件にしたいです。10秒に特に根拠がないからです。

数学に詳しくないのでよくわからないのですが、「無限であること」を再現して、その条件から外れるとループ処理から外せることはできますか?

該当のソースコード

処理時間が10秒超えたらbreak

python

1import time 2 3start = time.time() 4while time.time() - start <= 10: 5 処理内容 6

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

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

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

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

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

Zuishin

2020/05/02 07:46 編集

自分で作るコードなら、無限かどうか自分でわかると思います。終了条件を満たせる可能性が無いなら無限です。 また、たとえ有限だとしても、処理に極めて長い時間がかかるなら終了させた方が良いと思います。
退会済みユーザー

退会済みユーザー

2020/05/02 07:46

それはどこで判断しますか? 時間だけですか?
Zuishin

2020/05/02 07:47

時間ではなく論理で判断できると思いますが、実際どのような処理を想定していますか?
退会済みユーザー

退会済みユーザー

2020/05/02 07:54 編集

ある文字列が与えられて、その要素である一文字全てがあるルールに則って変化します。 何回かのループの後、その文字列が、最初の文字列と同じになったらループから外れます。同じにならなければ=無限ループであれば、同じにならないと出力します。
Zuishin

2020/05/02 07:56

同じになる可能性が無ければ無限です。あるなら有限です。それ以上は具体的な条件がわからないので言えません。
Zuishin

2020/05/02 07:59

たとえばある文字 abc が与えられ、最初の一文字 a が a から z までの値を順に取るなら、これは有限です。しかし b から z の値を取るなら、これは無限です。
guest

回答4

0

ベストアンサー

「無限である」ということそのものを条件にしたいです。

「あるコードが無限ループになるか」を、どんなコードでも有限時間内に正しく判定する方法は、存在しないことが証明されています

理論計算機科学で「停止性問題」と呼ばれる問題です。

投稿2020/05/02 07:58

maisumakun

総合スコア145121

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

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

退会済みユーザー

退会済みユーザー

2020/05/02 08:13

ありがとうございます。停止性問題という言葉を初めて知りました 面白いです ということは、無限かどうかを判断するには、やはり時間で考えるしかないということですか?
maisumakun

2020/05/02 08:21

> 無限かどうかを判断するには、やはり時間で考えるしかないということですか? コードの動きを人間が考えて結論づけることは、(普通のプログラムの場合)たいてい可能です。
退会済みユーザー

退会済みユーザー

2020/05/02 08:23

すいません。どういう意味ですか?
maisumakun

2020/05/02 08:28

書いてのとおりです。機械的な判定は不可能ですが、人間がコードを追いかけて、どのような動作をするか分析するという手段がある、ということです。 (もっとも、理論計算機科学の分野でなければ、無限ループしうるプログラムを実用する場面は「メッセージループなど、永久に繰り返すことを意図して無限ループさせている」あるいは「数値解析など、処理が進んでみないときちんと終わるかわからない」ものなので、分析する必要は通常生じません)
退会済みユーザー

退会済みユーザー

2020/05/02 08:45

丁寧にありがとうございます。 勉強してきます
guest

0

時間でなくループ回数で判定してみては如何でしょう。
その処理のループ回数の最大を見積もることができることが必要ですが。

ここでは 2 つの ループで回している処理があります。
最初のループは 10 秒かかりますが、処理は終了します。
次のループは、break 判定が間違っているので break が実行されうることがありません。
でもループ実行回数が 想定されるループ回数より多いので変だ と感知しています。

p.py

python3

1import time 2 3MAX_LOOP_COUNT = 100 4 5# 処理時間がかかるが, 想定される最大ループ回数m中で処理が終わる 6# 1 .. 10 までの合計を求める 7sum = 0 8i = 1 9loop_count = 0 10 11while loop_count < MAX_LOOP_COUNT: 12 print(".", flush=True, end="") 13 time.sleep(1) 14 sum += i 15 i += 1 16 if i >= 10: 17 break 18 loop_count += 1 19 20if loop_count >= MAX_LOOP_COUNT: 21 print("\n無限ループの可能性があるので、処理を中断しました。") 22else: 23 print("\nsum=", sum) 24 25# break 条件が間違っているので無限ループになってしまう処理だが、 26# それを検知している。 27sum = 0 28i = 1 29loop_count = 0 30while loop_count < MAX_LOOP_COUNT: 31 print(".", flush=True, end="") 32 time.sleep(0.01) 33 sum += i 34 i += 1 35 if i < 0: # <-- 条件が間違っている 36 break 37 loop_count += 1 38 39if loop_count >= MAX_LOOP_COUNT: 40 print("\n無限ループの可能性があるので、処理を中断しました。") 41else: 42 print("\nsum=", sum) 43

実行例
イメージ説明

投稿2020/05/02 08:39

katoy

総合スコア22324

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

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

退会済みユーザー

退会済みユーザー

2020/05/02 09:16

丁寧にありがとうございます
guest

0

停止性問題の話をしているように見えますが。

無限ループに陥っているかどうかを判定する方法が仮にあったとして「自身が無限ループに陥っていないと判定できたらループを続行する、無限ループに陥っていると判定できたらbreakして終了する」プログラムはどう振る舞うでしょう? みたいな話ですね。

投稿2020/05/02 08:06

編集2020/05/02 08:17
quickquip

総合スコア11029

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

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

退会済みユーザー

退会済みユーザー

2020/05/02 08:12

ありがとうございます。停止性問題という言葉を初めて知りました 面白いです
guest

0

下記で無限ループになります。

Python

1while True: 2 psss

適切な条件でbreakするよう設定すれば良いです。

投稿2020/05/02 07:52

meg_

総合スコア10577

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問