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

发布于 2024-08-30 14:41:51 字数 824 浏览 3 评论 0原文

为什么我的递归函数会出现分段错误。每次我调用它时,当参数大于 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);

Why do I get a segmentation fault in my recursive function. It happens every time i call it when a value greater than 4 as a parameter

#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;

}

This works fine, but i'm not sure that returns the correct result:

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

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

意中人 2024-09-06 14:41:51
return printSeries(n-3) + printSeries( (n-2) + printSeries(n-1) );
//                                     ^^^^^^^^^^^^^^^^^^^^^^^^

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

考虑当n = 4时,

f(4) = 1 + f(2 + f(3))
     = 1 + f(2 + 3)
     = 1 + f(5)
     = 1 + [ f(2) + f(3 + f(4)) ]
     = ...
return printSeries(n-3) + printSeries( (n-2) + printSeries(n-1) );
//                                     ^^^^^^^^^^^^^^^^^^^^^^^^

Incorrect nesting of parenthesis causes infinite recursion, which leads to stack overflow (segfault).

Consider when n = 4,

f(4) = 1 + f(2 + f(3))
     = 1 + f(2 + 3)
     = 1 + f(5)
     = 1 + [ f(2) + f(3 + f(4)) ]
     = ...
情绪 2024-09-06 14:41:51

上面提到的括号问题就是无限递归的根源。但是,即使您将情况 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 万亿次。

换句话说,您的代码所做的工作比应有的多。你明白为什么吗?

The parentheses problem mentioned above is the source of the infinite recursion. But there's another problem with the code even if you fix the parentheses for case 5 to be like case 4:

printSeries(4) recursively invokes printSeries 3 times.
printSeries(5) recursively invokes printSeries 6 times.
printSeries(6) recursively invokes printSeries 12 times.
printSeries(10) recursively invokes printSeries 156 times.
printSeries(20) recursively invokes printSeries 69747 times.
printSeries(50) recursively invokes printSeries over 6 trillion times.

In other words, your code is doing way more work than it should. Do you see why?

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文