2013-04-23 114 views
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; 
} 

为什么不是这个递归工作?它试图运行,然后崩溃。请告诉我。我的老师说,它会工作,但没有。C++递归分割错误

+0

你知道这有一个封闭的公式,不是吗? 1 + 3 + 5 + ... + 2n-1 = n * n。 – 2013-04-23 14:53:26

回答

5

n是偶数时,您将递减n两位。如果它跳过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

0

你必须让它

if (n > 1) 

这里

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

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

考虑n = 2并改变这一点。现在它只是计算奇数的数量。你需要总结它们。

return(n + findSumofOdds(n - 1)); 
} 
else 
    return 0; 
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)为n=5)较小的总和或者你只需​​要算来(这是你现在正在做什么)? 如果你想总结这些数字,你在返回时添加了n而不是1