- ベストアンサー
助けてください・・・
大学のプログラミングの講義で試験があり、以下の設問がありました。 次のプログラムのprintf文で何が表示されるか? #include<stdio.h> int pow2_a (int); int main (void) { printf("\n%d\n", pow2_a(12)); return 0; } int pow2_a (int n) { int p=1; if (n>0) { int tmp, m; m = n/2; printf("-- call pow2_a(%2d)\n", m); tmp = pow2_a(m); if (n%2==0) { p = tmp*tmp; } else { p = tmp*tmp*2; } } printf("-- return%8d\n", p); return p; } この答えが以下のようになるようです。 -- call pow2_a( 6) -- call pow2_a( 3) -- call pow2_a( 1) -- call pow2_a( 0) -- return 1 -- return 2 -- return 8 -- return 64 -- return 4096 そこで「--return 1 」と書いてあるところまでは分かるのですが、これ以下の表示が何故こうなるか理解できません。 お分かりの方教えてください。m(__)m
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
#2です ごめんです 勘違い・・・ > if (n>0) { n=0で、この中が処理されず > -- return 1 が、戻ってくるのね > -- call pow2_a( 6) ↑call pow2_a(12)で、呼び出された処理 > -- call pow2_a( 3) ↑call pow2_a(6)で、呼び出された処理 > -- call pow2_a( 1) ↑call pow2_a(3)で、呼び出された処理 > -- call pow2_a( 0) ↑call pow2_a(1)で、呼び出された処理 > -- return 1 ↑call pow2_a(0)で、呼び出された処理 > -- return 2 ↑call pow2_a(1)で、呼び出された処理 > -- return 8 ↑call pow2_a(3)で、呼び出された処理 > -- return 64 ↑call pow2_a(6)で、呼び出された処理 > -- return 4096 ↑call pow2_a(12)で、呼び出された処理 と、言う話になります
その他の回答 (2)
- Dxak
- ベストアンサー率34% (510/1465)
すみません 再帰の問題だとは、思うのですが・・・ > m = n/2; なので、2行前の > if (n>0) { で、nにマイナスが来ることが考えられないのですが・・・ プログラムの記載は、間違ってませんか? > -- return 1 のところが、出てくることは無く > tmp = pow2_a(m); が、m=0で、呼び続けて無限ループに入ってしまうような気がしてます プログラムの記載確認、お願いできませんか? 私のほうの勘違いなら、良いのですが・・・
- redfox63
- ベストアンサー率71% (1325/1856)
--- return 1 で戻るのは tmp = pow2_a(m); の代入文です 1が返されるのは pow1_aの引数nが0のときでありこの呼び出し行った時点でのnは3だということが-- call pow2_a(0)の前の出力から判断出来ます となると この後のif文の条件は不成立になり temp = temp * temp * 2 = 2*2*2 = 8 となります このように順に--- call pow2_aの引数とif文を順次照らしていけばこの出力の意味がわかると思います 命令を実行される順に書き出し その時点での変数の値を書き出しながら確認してみましょう Excelなどの表計算ソフトで A列に命令、B列にそのときの変数の値 サブルーチン(関数)に移行したら2列右に記入 関数から戻ったら2列左にもどる といった表を作ってみましょう