0
#include <iostream>

using namespace std;

int findSumofOdds(int n);

int main()
{

  int n = 88;
  int x;

  x = findSumofOdds(n);
  cout << x << endl;


  return 0;
}

int findSumofOdds(int n)
{
  if (n != 1)
  {
    if( n % 2 == 0)
      n = (n - 1);

    return(findSumofOdds(n-1) + 1);
  }
  else
    return 1;
}

この再帰が機能しないのはなぜですか? 実行しようとするとクラッシュします。私にお知らせください。私の先生はそれがうまくいくと言いましたが、うまくいきません。

4

3 に答える 3

5

nが偶数の場合、2ずつ減っていますn。をスキップするn == 1と、スタック オーバーフローが発生するまで再帰します。88で始まって以来、それnが起こっています。

int findSumofOdds(int n)
{
    if (n != 1)
    {
        if( n % 2 == 0)
            n = (n - 1); // <== first decrement

        return(findSumofOdds(n-1) + 1); // <== second decrement
    }
    else
        return 1;
}

また、奇数を足すのではなく、奇数を数えているようです。私の推測では、実際には次のようなものが必要です。

int findSumofOdds(int n)
{
    if (n != 1)
    {
        if( n % 2 == 0)
            return(findSumofOdds(n - 1));

        return(findSumofOdds(n-1) + n); // or + 1 to just count
    }
    else
        return 1;
}

再帰を練習したい場合は、それで問題ありません。しかし、以下の奇数を合計する関数を書くもっと簡単な方法がありますn

int fundSumofOdds(int n) {
    n = (n + 1) / 2;
    return n * n;
}

これは、次の一般的な式があるためです。

1 + 3 + 5 + ... + 2n-1 = n 2

于 2013-04-23T14:45:55.237 に答える
0

あなたはそれをしなければなりません

if (n > 1)

n = 2ここで検討する

 if (n != 1)
 {
   if( n % 2 == 0)  // Yes
      n = (n - 1);  // n = 1

   return(findSumofOdds(n-1) + 1);  // n = 0  <-- will not stop.

これも変更します。今は奇数の数を数えているだけです。それらを合計する必要があります。

   return(n + findSumofOdds(n - 1));
}
else
    return 0;
于 2013-04-23T14:46:11.087 に答える
0

印刷nすると、findSumofOdds何が起こっているかがわかります --nが負になり、無限再帰になります。プログラムが以前にクラッシュしなかった場合、整数オーバーフロー (nの最小値を下回った場合int) が発生し、未定義の動作が発生する可能性があります。これを修正するには、次のようにします。

int findSumofOdds(int n)
{
    if(n < 1)
    {
        return 0;
    }

    if(n % 2 == 0)
    {
        return findSumofOdds(n - 1) + 1;
    }
    return findSumofOdds(n - 2) + 1;
}

最後のステートメントでから 2 を引くことができますn。これは、奇数のみが必要でありn、その時点で が偶数にならないことがわかっているためです ( のためif(n % 2 == 0))。

また、より小さいすべての奇数の合計を求める必要がありますかn(例: 4( == 1 + 3) for n=5)、またはそれらを数えるだけでよいですか (これが現在行っていることです)。数値を合計したい場合は、戻るときnの代わりに加算する必要があります。1

于 2013-04-23T15:10:18.893 に答える