递归函数错过了基本条件
计算数字的阶乘是递归函数的典型示例。
缺少基本条件:
#include <stdio.h>
int factorial(int n)
{
return n * factorial(n - 1);
}
int main()
{
printf("Factorial %d = %d\n", 3, factorial(3));
return 0;
}
典型输出:Segmentation fault: 11
这个函数的问题是它会无限循环,导致分段错误 - 它需要一个基本条件来停止递归。
基本条件声明:
#include <stdio.h>
int factorial(int n)
{
if (n == 1) // Base Condition, very crucial in designing the recursive functions.
{
return 1;
}
else
{
return n * factorial(n - 1);
}
}
int main()
{
printf("Factorial %d = %d\n", 3, factorial(3));
return 0;
}
样本输出
Factorial 3 = 6
一旦碰到条件 n
等于 1,该函数就会终止(假设 n
的初始值足够小 - 当 int
为 32 位数量时,上限为 12
)。
要遵循的规则:
- 初始化算法。递归程序通常需要种子值才能开始。这可以通过使用传递给函数的参数或通过提供非递归的网关函数来实现,但是为递归计算设置种子值。
- 检查正在处理的当前值是否与基本情况匹配。如果是,请处理并返回值。
- 根据更小或更简单的子问题或子问题重新定义答案。
- 在子问题上运行算法。
- 将结果结合在答案的表述中。
- 返回结果。
来源: 递归函数