繁体   English   中英

递归函数中的分段错误C ++

[英]Segmentation fault C++ in recursive function

为什么我的递归函数会出现分段错误。 每当我将一个大于4的值作为参数调用它时,就会发生这种情况

#include <iostream>
#include <limits>

using namespace std;    

int printSeries(int n){
    if(n==1){       
        return 1;
    }
    else if( n==2){     
        return 2;
    }
    else if( n==3){
        return 3;
    }
    else if( n==4){
        return printSeries(1) + printSeries(2) + printSeries(3);
    }
    else{       
        return printSeries(n-3) + printSeries((n-2) + printSeries(n-1));
    }
}


int main(){

        //double infinity = numeric_limits<double>::max();

        for(int i=1; i<=10; i++){
            cout << printSeries(i) << endl;
        }

    return 0;

}

这工作正常,但我不确定是否返回正确的结果:

return printSeries(n-3) + printSeries(n-2) + printSeries(n-1);
return printSeries(n-3) + printSeries( (n-2) + printSeries(n-1) );
//                                     ^^^^^^^^^^^^^^^^^^^^^^^^

括号的不正确嵌套会导致无限递归,从而导致堆栈溢出(segfault)。

n = 4时考虑,

f(4) = 1 + f(2 + f(3))
     = 1 + f(2 + 3)
     = 1 + f(5)
     = 1 + [ f(2) + f(3 + f(4)) ]
     = ...

上面提到的括号问题是无限递归的来源。 但即使您将案例5的括号修复为案例4,代码还有另一个问题:

printSeries(4)以递归方式调用printSeries 3次。
printSeries(5)递归调用printSeries 6次。
printSeries(6)以递归方式调用printSeries 12次。
printSeries(10)以递归方式调用printSeries 156次。
printSeries(20)以递归方式调用printSeries 69747次。
printSeries(50)以递归方式调用printSeries超过6万亿次。

换句话说,你的代码做的比它应该的方式更多的工作。 你明白为什么吗?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM