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

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

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

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

Q&A

1回答

288閲覧

segmaentation fault の解決法

sizuku_mikan

総合スコア0

C

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

0グッド

1クリップ

投稿2025/04/22 11:02

実現したいこと

どのような数が入力された場合でも正しく合計値が計算できる。
引数として入力された値より一つ大きい/小さい値を引数として同じ関数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等で検索した
  • ソースコードを自分なりに変更した
  • 知人に聞いた
  • その他
上記の詳細・結果

再帰関数が正しく動いていないのは分かったが、直し方がわからない。

補足

特になし

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

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

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

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

melian

2025/04/22 12:04 編集

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) が実行される つまり、再帰関数の呼び出しが続くので、最終的にスタックオーバーフローが発生することになります。
TakaiY

2025/04/22 14:45

(回答は解答欄に書きましょう >melianさん)
jimbe

2025/04/22 17:14 編集

>再帰関数が正しく動いていないのは分かったが、直し方がわからない。 まだ原因の追求が足りません。原因が正しくわかっていなければ直し方なんて分かりません。 何がどのように正しく動いていないのかを調べてください。 sum(1,1) や sum(1,2) 、 sum(2,1) でどう動くのか(どのような順に何行目を通って各変数値はどんな値になって…)を机上でシミュレーションしては如何でしょうか。
guest

回答1

0

現状のコードは、xyの差が1になると、sum(x+1, y-1) で範囲が逆転し、無限再帰になってしまいます。

9行目からを以下のようにするといいかもしれません。

c

1 if (x == y) { 2 return x; 3 } 4 if (x + 1 == y) { 5 return x + y; 6 } 7 return x + y + sum(x + 1, y - 1);

投稿2025/04/23 22:05

int32_t

総合スコア21927

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.31%

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

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

質問する

関連した質問