相关疑难解决方法(0)

g ++中尾部递归的问题

我正在用C++搞乱尾递归函数,而且我在使用g ++编译器时遇到了一些麻烦.

numbers[]大小超过几百个整数时,以下代码导致堆栈溢出.检查由g ++生成的汇编代码,表明twoSum_Helper正在call对自身执行递归指令.

问题是以下哪一项导致了这种情况?

  • 我忽略了下面的一个错误,它阻止了尾递归.
  • 我使用g ++时出错了.
  • g ++编译器中检测尾递归函数的缺陷.

我正在g++ -O3 -Wall -fno-stack-protector test.c通过MinGW和g ++ 4.5.0在Windows Vista x64上进行编译.

struct result
{
    int i;
    int j;
    bool found;
};

struct result gen_Result(int i, int j, bool found)
{
    struct result r;
    r.i = i;
    r.j = j;
    r.found = found;
    return r;
}

// Return 2 indexes from numbers that sum up to target.
struct result twoSum_Helper(int numbers[], int size, int target, int i, …
Run Code Online (Sandbox Code Playgroud)

c++ recursion functional-programming tail-recursion g++

11
推荐指数
1
解决办法
1320
查看次数

传递参考阻碍了尾部呼叫消除的gcc

BlendingTable::createBlendingTable::print.两者都具有相同形式的尾递归,但是虽然create将被优化为循环,但print不会导致堆栈溢出.

下来看一个修复,我从一个gcc开发人员的提示中得到了我的错误报告中的问题.

#include <cstdlib>
#include <iostream>
#include <memory>
#include <array>
#include <limits>

class System {
public:
    template<typename T, typename... Ts>
    static void print(const T& t, const Ts&... ts) {
        std::cout << t << std::flush;
        print(ts...);
    }

    static void print() {}

    template<typename... Ts>
    static void printLine(const Ts&... ts) {
        print(ts..., '\n');
    }
};

template<typename T, int dimension = 1>
class Array {
private:
    std::unique_ptr<T[]> pointer;
    std::array<int, dimension> sizes;
    int realSize;

public:
    Array() {} …
Run Code Online (Sandbox Code Playgroud)

c++ recursion gcc functional-programming tail-call-optimization

7
推荐指数
1
解决办法
297
查看次数