递归和尾递归
递归
计算结果保存在参数中传递到当前函数中, 运算结束后返回当前函数继续运算.
阶乘
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| #include <stdio.h>
int factorial(int n) { if (n < 0) return 0; else if (n <= 1) return 1; else return factorial(n - 1) * n; }
int main() { int n = 5000; printf("n: %d %d\n", n, factorial(n)); }
|
会爆栈

尾递归
计算结果保存在参数中传递到下一个函数中, 当前函数实际上结束运算.
阶乘
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| #include <stdio.h>
int factorial_tail(int n, int ret) { if (n < 0) return 0; else if (n == 0) return 1; else if (n == 1) return ret; else return factorial_tail(n - 1, n * ret); }
int main() { int n = 5000; printf("n: %d %d\n", n, factorial_tail(n, 1)); }
|
一样会爆栈 不过如果编译器有优化 可以达到不爆栈
