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

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

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

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Q&A

解決済

2回答

1256閲覧

関数内の計算の仕方について

Japanise

総合スコア11

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

0グッド

0クリップ

投稿2020/08/18 18:19

このプログラムの答えは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ページで確認できます。

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

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

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

DreamTheater

2020/08/18 23:04

コードはマークダウンの<code>内に書きましょう。 コードがインデントされていないのならその際インデントしましょう。
guest

回答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により、x128が表示されます。

投稿2020/08/18 19:23

amiya

総合スコア1218

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

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

Japanise

2020/08/19 01:03

下から18行目のhoge(3)に制御が戻ってくるのはどこから戻ってきたのか理解できていないので教えてほしいです。
Japanise

2020/08/19 01:37

とてもわかりやすく理解することができました! ありがとうございました!
amiya

2020/08/19 01:50

トレースですので、全てその前の行から処理は移動してきます。 hoge(3)に制御が戻ってきます。 hoge(2)の返り値は8だったので… のところであれば、その直前の hoge(2)に制御が戻ってきます。 (略) それが返されるので、hoge(2)の返り値は8となります。 から戻ってきます。
Japanise

2020/08/19 03:02

とてもわかりやすい解説ありがとうございます。
guest

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

mjk

総合スコア303

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問