递归和尾递归

递归和尾递归

递归

计算结果保存在参数中传递到当前函数中, 运算结束后返回当前函数继续运算.

阶乘

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));
}

一样会爆栈 不过如果编译器有优化 可以达到不爆栈

尾递归结果