このプログラムの答えは128になるのですが、どのような計算をして128になるのかがわからないです。
#include <stdio.h>
int hoge(int a){
if( 2 <= a ){
int x = hoge(a-1);
return x * x * hoge(a-2);
} else {
return 2;
}
}
void main(){
int x = hoge( 3 );
printf("%d", x);
}
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答2件
0
ベストアンサー
関数の中で同じ関数が呼び出される、いわゆる再起呼び出しと呼ばれるものです。
この手のは順番に追いかけてゆきます。
まずは、main
の中でhoge(3);
が呼び出されます。
hoge(3)
が開始されます。引数は3
なので、a=3
です。
if( 2 <= a )
は2<=3
なので、真のルートに進みます。
hoge(a-1);
で再びhoge()
が呼び出されます。今度はa-1
なのでhoge(2)
です。
hoge(2)
が開始されます。引数は2
なので、a=2
です。
if( 2 <= a )
は2<=2
なので、真のルートに進みます。
hoge(a-1);
で再びhoge()
が呼び出されます。今度はa-1
なのでhoge(1)
です。
hoge(1)
が開始されます。引数は1
なので、a=1
です。
if( 2 <= a )
は2<=1
なので、偽のルートに進みます。
return 2
なので、返り値は2
になります。
hoge(2)
に制御が戻ってきます。
hoge(1)
の返り値は2
だったので、x=2
となり、次に進みます。
x * x * hoge(a-2);
に、またhoge()
が出てくるので、呼び出されます。
今度は、a-2
なので、hoge(0)
です。
hoge(0)
が開始されます。引数は0
なので、a=0
です。
if( 2 <= a )
は2<=0
なので、偽のルートに進みます。
return 2
なので、返り値は2
になります。
hoge(2)
に制御が戻ってきます。
hoge(0)
の返り値は2
だったので、
x * x * hoge(a-2);
は、2 * 2 * 2
となります。
それが返されるので、hoge(2)
の返り値は8
となります。
hoge(3)
に制御が戻ってきます。
hoge(2)
の返り値は8
だったので、x=8
となり、次に進みます。
x * x * hoge(a-2);
に、またhoge()
が出てくるので、呼び出されます。
今度は、a-2
なので、hoge(1)
です。
hoge(1)
が開始されます。引数は1
なので、a=1
です。
if( 2 <= a )
は2<=1
なので、偽のルートに進みます。
return 2
なので、返り値は2
になります。
hoge(3)
に制御が戻ってきます。
hoge(1)
の返り値は2
だったので、
x * x * hoge(a-2);
は、8 * 8 * 2
となります。
それが返されるので、hoge(8)
の返り値は128
となります。
main
に制御が返ってきます。
hoge(3)
の返り値は128
だったので、x=128
となり、次に進みます。
printf
により、x
の128
が表示されます。
投稿2020/08/18 19:23
総合スコア1218
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/08/19 01:03
2020/08/19 01:37
2020/08/19 01:50
2020/08/19 03:02
0
自分でもよく分からなかったのでhoge(n) n=0 から n=5まで計算してみましたのでご参考までに。
結論:hoge(n) = hoge(n-1)^2 * hoge(n-2)
手作業で計算する場合
hoge(0)=2 と hoge(1)=2 は関数内から固定で分かります。
hoge(2) = hoge(1)^2 * hoge(0) なので当てはめると、
hoge(2) = 2 * 2 * 2 = 8
hoge(3) = hoge(2)^2 * hoge(1) なので同様に計算すると、
hoge(3) = 8 * 8 * 2 = 128
以降順番にhoge(0)~hoge(5)まで計算出来ました。
但しn=6以降は桁が大きすぎてlong long型でも表示しきれません。
hoge(0) = 2
hoge(1) = 2
hoge(2) = 8
hoge(3) = 128
hoge(4) = 131072
hoge(5) = 2199023255552
hoge(0) = 2
hoge(1) = 2
hoge(2) = 2 * 2 * 2
hoge(3) = 8 * 8 * 2
hoge(4) = 128 * 128 * 8
hoge(5) = 131072 * 131072 * 128
C
1#include <stdio.h> 2 3int count; 4 5long long hoge(long long a) { 6 7 long long result = 0; 8 if (2 <= a) { 9 long long x = hoge(a - 1); 10 result = x * x * hoge(a - 2); 11 } else { 12 result = 2; 13 } 14 count++; 15 printf("%s %d %s %lld %s %lld %s %lld \n", "count:", count, " a=", a, " x=", result, 16 " result=", result); 17 return result; 18} 19int main() { 20 int start_x = 0; 21 int end_x = 5; 22 23 for (int i = start_x; i <= end_x; i++) { 24 count = 0; 25 printf("%s %d %s %lld\n\n","hoge(",i,")=", hoge(i)); 26 } 27 getchar(); 28 return 0; 29} 30
txt
1count: 1 a= 0 x= 2 result= 2 2hoge( 0 )= 2 3 4count: 1 a= 1 x= 2 result= 2 5hoge( 1 )= 2 6 7count: 1 a= 1 x= 2 result= 2 8count: 2 a= 0 x= 2 result= 2 9count: 3 a= 2 x= 8 result= 8 10hoge( 2 )= 8 11 12count: 1 a= 1 x= 2 result= 2 13count: 2 a= 0 x= 2 result= 2 14count: 3 a= 2 x= 8 result= 8 15count: 4 a= 1 x= 2 result= 2 16count: 5 a= 3 x= 128 result= 128 17hoge( 3 )= 128 18 19count: 1 a= 1 x= 2 result= 2 20count: 2 a= 0 x= 2 result= 2 21count: 3 a= 2 x= 8 result= 8 22count: 4 a= 1 x= 2 result= 2 23count: 5 a= 3 x= 128 result= 128 24count: 6 a= 1 x= 2 result= 2 25count: 7 a= 0 x= 2 result= 2 26count: 8 a= 2 x= 8 result= 8 27count: 9 a= 4 x= 131072 result= 131072 28hoge( 4 )= 131072 29 30count: 1 a= 1 x= 2 result= 2 31count: 2 a= 0 x= 2 result= 2 32count: 3 a= 2 x= 8 result= 8 33count: 4 a= 1 x= 2 result= 2 34count: 5 a= 3 x= 128 result= 128 35count: 6 a= 1 x= 2 result= 2 36count: 7 a= 0 x= 2 result= 2 37count: 8 a= 2 x= 8 result= 8 38count: 9 a= 4 x= 131072 result= 131072 39count: 10 a= 1 x= 2 result= 2 40count: 11 a= 0 x= 2 result= 2 41count: 12 a= 2 x= 8 result= 8 42count: 13 a= 1 x= 2 result= 2 43count: 14 a= 3 x= 128 result= 128 44count: 15 a= 5 x= 2199023255552 result= 2199023255552 45hoge( 5 )= 2199023255552 46
投稿2020/08/18 21:23
総合スコア303
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。