2017-03-04 12 views
-1

私はプログラム方法を研究しており、最近では入力された2つの数値の合計を最小から最大まで計算する問題に取り組んでいます。たとえば、誰かが4,7という数字を入力したとします。計算は4 + 5 + 6 + 7 = 22になります。Cでの再帰関数の記述

私はrecSumの定義と思われるものを試みましたが、明らかにセグメント化エラーが発生するので間違っています。私の定義に何が間違っていますか?

/* Define the recursive function */ 
int recSum (int x, int max) 
{ 
int incrementalSum = 0; 
if (x == max) 
{ 
    return x; /* Exit if summated lower to upper numbers */ 
} 
else 
{ 
    return (x + recSum(x++, max)); /* My recursive call */ 
} 
} /* End of function call */ 

*新しいコードが上に表示されます。申し訳ありませんが、間違ったコードを使用しました。

+0

を参照してください。 –

+0

'goto'構造体は' while(1){...} 'ループと同じです。ループは再帰ではありません。 – emlai

+0

運動目的のための再帰的/反復的な解を書こうとしますか、または1-nからすべての整数を合計するための公式を知らないのですか? – MikeMB

答えて

2

理由は、この行です:

return x + recSum(x++, max); 

x++ずつのXが、以前の値を返すので、再帰呼び出しで、それがインクリメント決して、あなたが基本ケースに到達することはありません。無限ループのように。たとえ正しくないとしても、結果を出すためにx++++xに置き換える必要があります。 ++xはxを変更しているため、最終的な合計はx + recSumに変更されます。あなたはより良い利用をしたい:あなたはそれが70年代だったら、少なくともそれが読みやすく、のようなコードを記述しようとしている場合

return x + recSum(x + 1, max); 

What is the difference between ++i and i++?

+0

あなたは男です!.... コードは今すぐ動作します。 –

5

あなたのコードが表現

incrementalSum = x + x++; 

が定義されていない3つの重要な問題

  1. があり、read this for more information

  2. あなたの関数は再帰関数が条件になるまで自己それを呼び出して、再帰的ではありません終了すべきところで起こる。

  3. はまた、「これまでgotoを使用していない」私は不合理ではないだことを指摘し、これはgotoを使用に対して正確に、なぜ一部の人のアドバイスです。

+0

「goto」のニースノート... – alk

1

あなたが以下の

int recSum(int x, int max) 
{ 
    return max < x ? 0 : x + recSum(x + 1, max); 
} 

それともlong long intのような関数の戻り値の型を宣言するためにも良いだろうことを意味らしいです。

long long int recSum(int x, int max) 
{ 
    return max < x ? 0 : x + recSum(x + 1, max); 
} 

関数は、xが最大値未満であるとき、通常はそれが呼び出されるため、それが最初の呼び出し

int recSum(int x, int max) 
{ 
    int incrementalSum = 0; 
    recCall: if (x < max) 
    return incrementalSum; 
    ^^^^^^^^^^^^^^^^^^^^^ 

に出て、あなたの機能については

printf("%lld\n", recSum(4, 7)); 

のように呼び出すことができます。だから関数は意味をなさない。さらに、関数自体を呼び出さないため、関数は再帰的ではありません。あなたのコードは動作しません

+0

Excelentの観測で、これは私の答えです。私は答えがマージされ、ユーザー間でupvotesとdownvotesを共有できるようにする必要があると思います。 –