【问题标题】:Segmentation Fault on Recursion递归分段错误
【发布时间】:2017-01-04 08:56:31
【问题描述】:

我想计算在 Collat​​z 序列中具有数字的递归调用的数量。但是对于这样一个更大的数字,例如 4565458458

#include <cstdlib>
#include <iostream>
#include <string>
#include <sstream>
using namespace std;

int f(int value){
    if(value==1) return 1;
    else if(value%2 == 0) return value/2;
    else return 3*value+1;
}

int g(int value){
   if(value == 0) return 0;
   if (f(value)==1) return 1;
   return 1 + g(f(value));
}

int main(int argc, char *argv[]){
    int nSteps=0;
    istringstream iss(argv[1]);
    int;
    if(!(iss >> num).fail()){
        if(num < 0) cout << "0" << endl;
        else{
            nSteps = g(num);
            cout << "Result: " << nSteps << endl;
        } 
    }
    else{
        cout << "Incorrect line paramaters: ./g n" << endl;
    }
    return 0;
}

【问题讨论】:

  • 欢迎来到 Stack Overflow!听起来您可能需要学习如何使用debugger 来单步执行您的代码。使用好的调试器,您可以逐行执行您的程序,并查看它与您期望的偏差在哪里。如果您要进行任何编程,这是必不可少的工具。进一步阅读:How to debug small programs.
  • 如果你递归足够多,你很可能会发生堆栈溢出
  • 程序不正确,无法编译,因为下面的错误:24:17: error: ‘num’ was not declared in this scope
  • @Nemanja Trifunovic - num-declaration 被不正确的编辑删除。

标签: c++ recursion segmentation-fault collatz


【解决方案1】:

您的程序将使用大量堆栈内存来处理大量输入。

另外f应该有相同的输入输出类型(原来是“unsigned long long”作为输入,int作为输出),否则结果会出错。

我建议您首先在不使用递归的情况下重写 g,如果可行,请尝试研究如何通过尾递归使 g 变得高效(当前的变体可能不支持它)。

按照其他人的建议使用调试器也很好,尤其是在调用“g”之前它崩溃时。

最后,'num

【讨论】:

  • 计算f(value) 两次可能无法帮助编译器发现潜在的尾递归优化
猜你喜欢
  • 2017-06-05
  • 2018-03-30
  • 1970-01-01
  • 1970-01-01
  • 2017-03-14
  • 1970-01-01
  • 2014-11-05
相关资源
最近更新 更多