c++递归分段错误

C++ Recursion Segmentation Fault

本文关键字:错误 分段 递归 c++      更新时间:2023-10-16
#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;
}

为什么这个递归不能工作?它试图运行,然后崩溃。请让我知道。我的老师说它会工作,但没有。

n为偶数时,将n递减2。如果它跳过n == 1,它将递归直到导致堆栈溢出。因为n从88开始,这就是发生的事情。

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 +…2

你必须让它

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;

如果你在findSumofOdds中打印n,你可以看到发生了什么——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;
}

你可以在最后的语句中从n中减去2,因为你只需要奇数,并且你知道n在那一点上不可能是偶数(因为if(n % 2 == 0))。

另外,您需要找到小于n的所有奇数的总和(例如4 (== 1 + 3) for n=5)还是您只需要计算它们(这就是您现在正在做的)?如果要求和,返回时必须添加n而不是1