我几乎了解尾递归的工作原理以及它与普通递归之间的区别。我 只是 不明白为什么它 不 要求堆栈来记住它的返回地址。
// 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); }
在尾部递归函数中调用函数本身之后,无需执行任何操作,但对我而言这没有意义。
编译器只需能够转换它
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; }