[過去ログ] 【初心者歓迎】C/C++室 Ver.100【環境依存OK】 [無断転載禁止]©2ch.net (1002レス)
上下前次1-新
抽出解除 レス栞
このスレッドは過去ログ倉庫に格納されています。
次スレ検索 歴削→次スレ 栞削→次スレ 過去ログメニュー
リロード規制です。10分ほどで解除するので、他のブラウザへ避難してください。
52(1): 43 [sage] 2016/11/10(木) 15:05:17.38 ID:8ULjF/bN(7/8) AAS
>>5151(1): デフォルトの名無しさん [sage] 2016/11/10(木) 14:51:19.03 ID:IzCfpVGN(1) AAS
>>43
まず大前提としてプログラムの流れは1本道で別れたりしないし、待機みたいなことも普通しない
そして再帰関数という特別な関数があるわけではない、recurseは普通の関数と何も変わらない
void recurse(int i)
{
if(i < 10) {
recurse(i + 1);
printf("%d " , i);
}
}
この4行目はrecurseという関数を呼び出している
つまり自分自身を呼ぶのでこの4行目の呼び出し後、recurse関数の最初に戻る
ただし引数iは1大きい値で呼ぶ
これを入れ子のように10回繰り返すことになる
レスありがとうございます。
外部リンク:ipa-zone.info
このページに私が使っている独習Cの再帰の部分が丸ごと転載されているんですが(違法?)、
i=0~10と昇順で増加していく前半部分でも呼び出された関数(recurse(1)など)は終了した訳ではないですよね?
後半のi=10から降順で減少していくときにはじめてprintfが実行されて関数が終了すると思うんですが、
LIFOなんで最後に呼び出されたrecurse(9)からrecurese(0)まで降順で残ったprintfを実行していくということではないんですか?
56: 52 [sage] 2016/11/10(木) 15:39:54.19 ID:8ULjF/bN(8/8) AAS
>>5353(1): デフォルトの名無しさん [sage] 2016/11/10(木) 15:15:27.68 ID:gEXUDT4B(5/5) AAS
>実行は新しい順(つまり今回の例の場合はi=9)ということですね。
難しく考える必要は無い
関数を呼び出すとき、自分が今何をしていたかをそっくりそのまま保存した状態で
新たにスタックを確保して、呼び出した関数を実行する
関数の実行が終わると、使っていたスタックを開放して
呼び出される前に実行していた処理に復帰する
ちょうど君が
1)ビデオを見ていた時に電話がかかってきたら、ビデオを一時停止して電話に出る
2)電話が終わると、ビデオを再生して続きを見る
のと同じで、ビデオの一時停止機能がスタックに相当している
で、君がこの日のことを日記を書くとき
1)のことを重視すれば、ビデオ→電話、って順になるし
2)のことを重視すれば、電話→ビデオ、って順になる
実際にはビデオ→電話→ビデオ、という順で物事は流れているんだが
どこのタイミングを切り取ってくるかで順番が変わるのだ
下から順番に1,2,3,4,5と積み上げて、上から順番に5,4,3,2,1と取り出すとき
積み上げるとき(積み上げる前)に出力すると1,2,3,4,5だし
取り出すとき(取り出した後)に出力すると5,4,3,2,1になる
実際には1,2,3,4,5,4,3,2,1という順で処理は走っているが(積み上げる→取り出す)
前半に着目すれば1,2,3,4,5だし、後半に着目すれば5,4,3,2,1なのだ
レスありがとうございます。参考になりました。
上下前次1-新書関写板覧索設栞歴
スレ情報 赤レス抽出 画像レス抽出 歴の未読スレ AAサムネイル
ぬこの手 ぬこTOP 0.041s