为什么尾部递归函数会导致分割错误?

时间:2019-02-23 01:23:21

标签: c segmentation-fault stack-overflow

通常,如果我有一个非终止的递归函数,它将不会永远运行,因为它将导致stackoverflow,最终导致分段错误。
据我所知,尾递归函数将当前的调用堆栈帧替换为具有实际值的相同函数的帧。 我得出的结论是,尾递归函数不能有stackoverflow,因此它们应该永远运行。

无尾递归:

int factor_rec (int n) {
    if (n == 0)
        return 1;

    return n * factor_rec (n - 1);
}

尾递归:

int factor_rec_tr (int n, int akk) {
    if (n == 0)
        return akk;

    return factor_rec_tr (n - 1, n * akk);
}

但是,当这些函数以负值调用时,这两个函数都会导致分段错误。为什么?

0 个答案:

没有答案