一尘不染

尾递归如何工作?

algorithm

我几乎了解尾递归的工作原理以及它与普通递归之间的区别。我 只是 不明白为什么它 要求堆栈来记住它的返回地址。

// tail recursion
int fac_times (int n, int acc) {
    if (n == 0) return acc;
    else return fac_times(n - 1, acc * n);
}

int factorial (int n) {
    return fac_times (n, 1);
}

// normal recursion
int factorial (int n) {
    if (n == 0) return 1;
    else return n * factorial(n - 1);
}

在尾部递归函数中调用函数本身之后,无需执行任何操作,但对我而言这没有意义。


阅读 164

收藏
2020-07-28

共1个答案

一尘不染

编译器只需能够转换它

int fac_times (int n, int acc) {
    if (n == 0) return acc;
    else return fac_times(n - 1, acc * n);
}

变成这样的东西:

int fac_times (int n, int acc) {
label:
    if (n == 0) return acc;
    acc *= n--;
    goto label;
}
2020-07-28