Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/124.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 分段故障C++;在递归函数中_C++_Recursion_Segmentation Fault - Fatal编程技术网

C++ 分段故障C++;在递归函数中

C++ 分段故障C++;在递归函数中,c++,recursion,segmentation-fault,C++,Recursion,Segmentation Fault,为什么在递归函数中会出现分段错误。当一个大于4的值作为参数时,每次调用它时都会发生这种情况 #include <iostream> #include <limits> using namespace std; int printSeries(int n){ if(n==1){ return 1; } else if( n==2){ return 2; } else

为什么在递归函数中会出现分段错误。当一个大于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;

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

考虑当n=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万亿次。


换句话说,您的代码所做的工作比它应该做的要多。你知道为什么吗?

我将第一个基本情况改为添加
std::cout,这不应该引发异常吗?@机器人:为什么应该引发异常?@机器人:为什么?这是完全有效的,它只会导致无限递归。@ THE.DROW:不幸的是,C++中没有<代码> STD::程序员Error Engult/Engult>。不过,你可能想提出这个建议。我是说stackoverflow例外
return printSeries(n-3) + printSeries(n-2) + printSeries(n-1);
return printSeries(n-3) + printSeries( (n-2) + printSeries(n-1) );
//                                     ^^^^^^^^^^^^^^^^^^^^^^^^
f(4) = 1 + f(2 + f(3))
     = 1 + f(2 + 3)
     = 1 + f(5)
     = 1 + [ f(2) + f(3 + f(4)) ]
     = ...