Я работаю с хвостовыми рекурсивными функциями в С++, и я столкнулся с некоторой проблемой с компилятором g++.
Следующий код приводит к переполнению стека, когда numbers[]
превышает пару сотен целых чисел. Изучение кода сборки, сгенерированного g++ для следующего, показывает, что twoSum_Helper выполняет рекурсивную инструкцию call
для себя.
Вопрос в том, какое из следующего вызывает это?
- Ошибка в следующем, что я игнорирую, что предотвращает хвостовую рекурсию.
- Ошибка при использовании g++.
- Недостаток в обнаружении хвостовых рекурсивных функций в компиляторе g++.
Я компилирую с g++ -O3 -Wall -fno-stack-protector test.c
в Windows Vista x64 через MinGW с g++ 4.5.0.
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);
}