1、直接递归
最直接的递归实现方式。
#include <stdio.h>
int factorial(int n) {
if (n == 0) {
return 1;
} else {
return n * factorial(n - 1);
}
}
int main() {
int num = 5;
printf("Factorial of %d is %d\n", num, factorial(num));
return 0;
}
2、尾递归
尾递归是一种优化的递归方式,其中递归调用是函数的最后一步操作。
#include <stdio.h>
int tail_factorial(int n, int accumulator) {
if (n == 0) {
return accumulator;
} else {
return tail_factorial(n - 1, n * accumulator);
}
}
int factorial(int n) {
return tail_factorial(n, 1);
}
int main() {
int num = 5;
printf("Factorial of %d is %d\n", num, factorial(num));
return 0;
}
3、三元运算符递归
使用三元运算符来简化代码。
#include <stdio.h>
int factorial(int n) {
return (n == 0) ? 1 : n * factorial(n - 1);
}
int main() {
int num = 5;
printf("Factorial of %d is %d\n", num, factorial(num));
return 0;
}
4、递归的分治法
通过分治法来计算阶乘,可以将大问题分解为更小的问题。
#include <stdio.h>
int factorial(int n) {
if (n <= 1) {
return 1;
} else if (n % 2 == 0) {
int half_factorial = factorial(n / 2);
return half_factorial * half_factorial * (n / 2) * (n / 2 + 1);
} else {
return n * factorial(n - 1);
}
}
int main() {
int num = 5;
printf("Factorial of %d is %d\n", num, factorial(num));
return 0;
}
5、递归的内存优化
通过动态编程思想,减少重复计算来优化内存使用。
#include <stdio.h>
int factorial(int n, int memo[]) {
if (n == 0) {
return 1;
}
if (memo[n] != 0) {
return memo[n];
}
memo[n] = n * factorial(n - 1, memo);
return memo[n];
}
int main() {
int num = 5;
int memo[6] = {0}; // 这里memo大小设置为 num+1
printf("Factorial of %d is %d\n", num, factorial(num, memo));
return 0;
}