C++递归分段错误

use*_*799 0 c++

#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;
}
Run Code Online (Sandbox Code Playgroud)

为什么这个递归不起作用?它试图运行然后崩溃.请告诉我.我的老师说它会起作用但不起作用.

Ted*_*opp 5

什么时候n,你减少n两个.如果它跳过n == 1,它将递归,直到它导致堆栈溢出.从n88 年开始,这就是发生的事情.

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;
}
Run Code Online (Sandbox Code Playgroud)

此外,您似乎在计算奇数的数量,而不是添加它们.我的猜测是你真的需要这样的东西:

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;
}
Run Code Online (Sandbox Code Playgroud)

如果你想练习递归,那很好.但是有一种更简单的方法可以编写一个函数来对奇数进行求和,包括n:

int fundSumofOdds(int n) {
    n = (n + 1) / 2;
    return n * n;
}
Run Code Online (Sandbox Code Playgroud)

这是因为有一个通用公式:

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