为什么我的递归函数在C中出错?

时间:2013-04-17 12:14:49

标签: c recursion

我的计划如下:

#include <stdio.h>

int collatz(int seed, int count) {
    int next = 0;
    if (seed % 2 == 0) {
        next = seed / 2;
    } else {
        next = 3 * seed + 1;
    }
    count++;
    if (next == 1) {
        return count;
    } else {
        return collatz(next, count);
    }
}

int main() {
    int max = 0;
    int index = 0;
    int i;
    for (i=1; i<1000000; i++) {
        int current = collatz(i, 1);
        if (current > max) {
            max = current;
            index = i;
        }
    }
    printf("%i\n", index);
    return 0;
}

我知道递归通常只会达到一定的深度。但是据我所知,我已经实现了尾递归,应该停止seg故障。如果我将i设置为100,000,程序运行会让我相信基础算法是正确的。然而我得到一百万:

  

分段错误:11

我做错了什么?

3 个答案:

答案 0 :(得分:10)

如果您使用调试器,您可能会发现您的函数确实不是尾递归的。但为什么不呢?可能是因为您只是忘了在编译期间启用优化。在我的系统上(Mac OS上的GCC),默认构建将崩溃,但使用-O3选项构建将使其运行(至少比其他时间更长;我不想杀死我的电池测试)。

答案 1 :(得分:1)

如果你使用100万运行它,我会说你可能只是耗尽了堆栈空间导致了段错误

您在VS stacksize中使用的编译器/操作系统默认为1MB,但可以增加。 我不确定其他编译器/ os组合

答案 2 :(得分:0)

collat​​z 函数在计算过程中导致溢出。 (这是堆栈溢出)。

注意:尾递归的编译器优化可能会也可能不会。

使用long long(Int64)。

int collatz(long long seed, int count) {
    long long next = 0;
    if (seed % 2 == 0) {
        next = seed / 2;
    } else {
        next = 3 * seed + 1;
    }
    count++;
    if (next == 1) {
        return count;
    } else {
        return collatz(next, count);
    }
}