分段错误 C++在递归函数中
为什么我的递归函数会出现分段错误。每次我调用它时,当参数大于 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 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
不正确的括号嵌套会导致无限递归,从而导致堆栈溢出(段错误)。
考虑当n = 4时,
Incorrect nesting of parenthesis causes infinite recursion, which leads to stack overflow (segfault).
Consider when 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 万亿次。
换句话说,您的代码所做的工作比应有的多。你明白为什么吗?
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?