実現したいこと
どのような数が入力された場合でも正しく合計値が計算できる。
引数として入力された値より一つ大きい/小さい値を引数として同じ関数sumを呼び出す。
発生している問題・分からないこと
segmentation fault というエラーが発生する
エラーメッセージ
error
1Segmentation fault (core dumped)
該当のソースコード
c言語
1#include<stdio.h> 2int call_count = 0; 3int sum(int x, int y) 4{ 5 call_count ++; 6 if(x > y){ 7 return sum(y,x); 8 } 9 if(x == y){ 10 return x; 11 }else{ 12 return x + y + sum(x+1, y-1); 13 } 14} 15int main(void){ 16 int x, y; 17 printf("1つ目の整数を入力せよ:"); 18 scanf("%d", &x); 19 printf("2つ目の整数を入力せよ:"); 20 scanf("%d", &y); 21 printf("%dから%dの合計は%dです。\n", x, y, sum(x, y)); 22 printf("関数sumが呼び出された回数:%d回\n", call_count); 23 24 return 0; 25}
試したこと・調べたこと
- teratailやGoogle等で検索した
- ソースコードを自分なりに変更した
- 知人に聞いた
- その他
上記の詳細・結果
再帰関数が正しく動いていないのは分かったが、直し方がわからない。
補足
特になし
call_count++ の直後にデバッグプリントを挿入すると、何が起こっているのか判るかと思います。
=====
call_count ++;
printf("count = %d: x = %d, y = %d\n", call_count, x, y);
=====
例えば、1つ目の整数を2, 2つ目の整数を9として実行してみます。
$ ./sum
1つ目の整数を入力せよ:2
2つ目の整数を入力せよ:9
count = 1: x = 2, y = 9
count = 2: x = 3, y = 8
count = 3: x = 4, y = 7 # sum(x+1, y-1) => sum(5, 6) が実行される
count = 4: x = 5, y = 6 # sum(x+1, y-1) => sum(6, 5) が実行される
count = 5: x = 6, y = 5 # 6 > 5 なので、if(x > y){return sum(y,x); } で sum(5, 6) が実行される
つまり、再帰関数の呼び出しが続くので、最終的にスタックオーバーフローが発生することになります。
(回答は解答欄に書きましょう >melianさん)
>再帰関数が正しく動いていないのは分かったが、直し方がわからない。
まだ原因の追求が足りません。原因が正しくわかっていなければ直し方なんて分かりません。
何がどのように正しく動いていないのかを調べてください。
sum(1,1) や sum(1,2) 、 sum(2,1) でどう動くのか(どのような順に何行目を通って各変数値はどんな値になって…)を机上でシミュレーションしては如何でしょうか。
