软件开发中的递归
// 一个构成递归调用的函数
static void DonotRunMe()
{
DonotRunMe(); //递归就是自己调用自己
}
小知识:堆栈溢出(StackOverflow)
- 程序代码其实是由“线程(Thread)”负责执行的。
- OS在创建线程(Thread)时,会给每个线程配套一块内存区域,线程可以用这块区域存储一些数据。
- 这块内存区域被称为“线程堆栈(thread stack)”
- 线程堆栈有容量限制,当一个线程要保存的数据超过了这个容量时,就发生了“堆栈溢出”
“递归(recursive)”的算法
- 代码要处理的数据或计算量在递归前后不断递减
实例:编个程序求n!
static int Factorial(int N)
{
int ans=1;
if (N <= 1)
return 1;
else
ans = N * Factorial(N - 1);
return ans;
}
小结:递归编程的套路
- 每个递归函数的开头一定是判断递归结束条件是否满足的语句(一般是if语句)
- 函数体一定至少有一句是自己调用自己的
- 每个递归函数一定有一个控制递归可以终结的变量(通常是作为函数的参数而存在)。每次自己调用自己时,此变量会变化(通常是变小),并传送给被调用的函数。
递推
static long Factorial2(int N)
{
long ans = 1;
for (int i=1;i<=N;i++)
{
ans = ans * i;
}
return ans;
}
递归vs递推
- 递归是从后到前再回来
- 递推是从前到后
- 递归和递推是等价的