内容会持续更新,有错误的地方欢迎指正,谢谢!
什么是迭代和递归
迭代的是人,递归的是神。 –L. Peter Deutsch
简单的定义: 当函数直接或者间接调用自己时,则发生了递归。但递归并不直观, 也不符合我们的思维习惯。因为递归的过程就是出入栈的过程。所以,每个递归程序都可把它改写为非递归版本,只需利用栈,通过入栈和出栈两个操作就可以模拟递归的过程,比如:二叉树的遍历。
如何思考递归
例子:
n的阶乘
int func(int n)
{
if(n<=1)
{
return 1;
}
return n*func(--n);
}
我们习惯的思维是:已知Factorial(0),乘上 1 就等于Factorial(1),再乘以 2 就等于Factorial(2),,,直到乘到 n。而递归和我们的思维方式正好相反。那我们怎么判断这个递归计算是否是正确的呢?
Paul Graham提到一种方法, 算是递归正确的思考方式,该方法如下:
1. 当n=0, 1的时候,结果正确。
2. 假设函数对于n是正确的,函数对n+1结果也正确。
如果这两点是成立的,我们知道这个函数对于所有可能的n都是正确的。
其实就是数学归纳法,第 1 点称为基本情况,第 2 点称为通用情况。最重要的是第1点,如果我们去掉if(n<=1)
这个基本情况后, 代码会进入死循环,永远不会结束,所以,把第 1 点称为终止条件。
递归的实现
递归的模板:
void f()
{
if(符合边界条件)
{
///////
return;
}
//某种形式的自调用
f()