再帰プログラムが再入可能である理由
広告
パセリさん
(No.1)
再帰プログラムは歳入可能であるとのことですが、なぜそうであるのかわかりません。
例えば以下のようなプログラムがあったとします。
int i = 0;
void recursive(){
i++;
if(i < 10){
recursive();
}
}
このプログラムは再帰ですが、グローバル変数の変更を行っているため、再入可能とは言えないと思います。
例えば以下のようなプログラムがあったとします。
int i = 0;
void recursive(){
i++;
if(i < 10){
recursive();
}
}
このプログラムは再帰ですが、グローバル変数の変更を行っているため、再入可能とは言えないと思います。
2025.01.30 14:41
reqさん
(No.2)
その通りです。
そのように書けばリエントラントではありません。
このように書くといいでしょう。
void recursive(int i){
i++;
if(i < 10){
recursive(i);
}
}
そのように書けばリエントラントではありません。
このように書くといいでしょう。
void recursive(int i){
i++;
if(i < 10){
recursive(i);
}
}
2025.01.30 16:35
こはさん
(No.3)
おそらく、reqさんの解答では、質問者さんの疑問は晴れないと思います。
https://www.ap-siken.com/kakomon/29_haru/q7.html
質問者さんは↑の問題に関して質問しているのかと推測されます。
上記問題の正解(ア)だと、「再帰的プログラム→再入可能」の命題が真であるといえます。
で、質問者さん疑問は、次の囲った内容だと思われます。
----------------------------------------------
「再帰的プログラム→再入可能」の命題の反例なるものを見つけました。ゆえに「再帰的プログラム→再入可能」の命題が偽と言えます。
だから、問題の正解はアと言えないのじゃないですか?
----------------------------------------------
反例を見つけたから疑問に思っているので、反例の内容を修正しても、質問者の疑問は晴れないかと思います。
間違えてたら申し訳ないです。どうぞよろしくお願いします。
https://www.ap-siken.com/kakomon/29_haru/q7.html
質問者さんは↑の問題に関して質問しているのかと推測されます。
上記問題の正解(ア)だと、「再帰的プログラム→再入可能」の命題が真であるといえます。
で、質問者さん疑問は、次の囲った内容だと思われます。
----------------------------------------------
「再帰的プログラム→再入可能」の命題の反例なるものを見つけました。ゆえに「再帰的プログラム→再入可能」の命題が偽と言えます。
だから、問題の正解はアと言えないのじゃないですか?
----------------------------------------------
反例を見つけたから疑問に思っているので、反例の内容を修正しても、質問者の疑問は晴れないかと思います。
間違えてたら申し訳ないです。どうぞよろしくお願いします。
2025.01.30 17:13
こはさん
(No.4)
結局のところ、
「質問者さんの挙げた反例が妥当ではない」
ということを回答しないと、質問者さんは疑問を晴らせないのかなと思います。
ここまで書いときながら、「妥当ではない」ことを回答できません。申し訳ないです。
「質問者さんの挙げた反例が妥当ではない」
ということを回答しないと、質問者さんは疑問を晴らせないのかなと思います。
ここまで書いときながら、「妥当ではない」ことを回答できません。申し訳ないです。
2025.01.30 17:18
jjon-comさん
★AP プラチナマイスター
(No.5)
> このプログラムは再帰ですが
いいえ、そのプログラムは「関数の再帰呼出し」を用いたプログラムであり、「再帰プログラム」ではありません。
No.3で提示された
応用情報 平成29年 春期 午前 問7
https://www.ap-siken.com/kakomon/29_haru/q7.html
に登場する「再帰プログラム」という用語は、
(質問者がご自身がすでに解説なさっているとおり)
> int i = 0;
の箇所も含めたプログラム全体として再帰呼び出しに対応した設計のプログラムだけを指しています。
2025.01.30 19:13
パセリさん
(No.6)
こはさん
その通りです。補足していただきありがとうございます。
jjon-comさん
『再帰的プログラムなら再入可能「プログラム」である』と考えていたからいけなかったのですね。
確かに「再帰的プログラム」をプログラム全体として考えると、そのプログラム自体は再入可能ですね(当たり前)。
「再入可能」と「再入可能プログラム」がごちゃごちゃになっていました。
その通りです。補足していただきありがとうございます。
jjon-comさん
『再帰的プログラムなら再入可能「プログラム」である』と考えていたからいけなかったのですね。
確かに「再帰的プログラム」をプログラム全体として考えると、そのプログラム自体は再入可能ですね(当たり前)。
「再入可能」と「再入可能プログラム」がごちゃごちゃになっていました。
2025.01.30 20:02
パセリさん
(No.7)
自分なりにまとめてみたのですが、合っていますでしょうか?
再帰的プログラムはプログラム内でプログラム自身を呼び出す。同一プログラムが同時に動くが得られる結果は正しいものであるため、再入可能である。
再帰的プログラムを複数のスレッドで呼び出したら得られるデータが正しくなくなる場合があるので再入可能ではないのでは?
→再帰的プログラムというのはプログラム全体を指しており、大域変数であってもそれぞれのスレッドが保持している変数(値)なので、並列実行しても結果は同一。
再帰的プログラムはプログラム内でプログラム自身を呼び出す。同一プログラムが同時に動くが得られる結果は正しいものであるため、再入可能である。
再帰的プログラムを複数のスレッドで呼び出したら得られるデータが正しくなくなる場合があるので再入可能ではないのでは?
→再帰的プログラムというのはプログラム全体を指しており、大域変数であってもそれぞれのスレッドが保持している変数(値)なので、並列実行しても結果は同一。
2025.01.30 23:57
jjon-comさん
★AP プラチナマイスター
(No.8)
No.7に登場するいくつかの用語について、それがどこの何を指すのか分からず具体的にイメージできなかったので、合っているかどうか私には分かりません。
とりあえず、wikipedia「リエントラント」のページに次の記述が登場することは指摘できますし、
私自身、情報処理技術者試験で出題される「再入可能」については、原始的な概念で知識を整理していることはお伝えできます。
https://www.ap-siken.com/bbs/4065.html のNo.10
とりあえず、wikipedia「リエントラント」のページに次の記述が登場することは指摘できますし、
> この定義はシングルスレッドのプログラミング環境が起源であり、
>
> リエントラント性の概念はシングルスレッドの環境に起源があり、
> マルチスレッド環境でのスレッドセーフという概念とは異なる。
私自身、情報処理技術者試験で出題される「再入可能」については、原始的な概念で知識を整理していることはお伝えできます。
https://www.ap-siken.com/bbs/4065.html のNo.10
2025.02.01 14:41
パセリさん
(No.9)
wikiを見てある程度理解できました。
ありがとうございました。
ありがとうございました。
2025.02.02 15:50
広告
返信投稿用フォーム
スパム防止のためにスレッド作成日から40日経過したスレッドへの投稿はできません。
広告