我在 C++ 中搞乱尾递归函数,并且在使用 g++ 编译器时遇到了一些问题。
当numbers[]
大小超过几百个整数时,以下代码会导致堆栈溢出。检查由 g++ 生成的汇编代码,发现 twoSum_Helper 正在call
对自身执行递归指令。
问题是以下哪项导致了这种情况?
- 以下是我忽略的一个错误,它阻止了尾递归。
- 我使用 g++ 的错误。
- 在 g++ 编译器中检测尾递归函数的缺陷。
我正在g++ -O3 -Wall -fno-stack-protector test.c
使用 g++ 4.5.0 通过 MinGW 在 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, int j)
{
if (numbers[i] + numbers[j] == target)
return gen_Result(i, j, true);
if (i >= (size - 1))
return gen_Result(i, j, false);
if (j >= size)
return twoSum_Helper(numbers, size, target, i + 1, i + 2);
else
return twoSum_Helper(numbers, size, target, i, j + 1);
}