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是偶数,你减n2。如果跳过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 + ... + 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

如果您打印nfindSumofOdds您可以看到正在发生的事情 -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 回答