递归算法简介
递归,一个在计算机领域里耳熟能详的词。
那递归到底是什么?
递归递归,递而归之。
说人话就是,二叉树。二叉树与递归有着紧密的关联,并且只要理解递归,二叉树也就理解得差不多了。
其实吧,递归就一个很简单的东西,简单来说就是自己里面还有个自己,自己吃自己((+_+)?)
递归算法
下面是一段递归的代码,C++的。
int dfs(int n) {
// 终止条件
if (n == 1 or n == 2) {
return 1;
}
// 递归内容
return dfs(n - 1) + dfs(n - 2);
}
int main() {
int n;
scanf("%d", &n);
printf("%d", dfs(n));
}
都知道斐波那契数列吧,上面这段代码就模拟了斐波那契数列的计算。
n 代表计算斐波那契数列的第几项。
而最重要的部分就是我们的递归函数了。
递归,有两个重要部分——终止条件和运行部分。
运行部分,很好理解,就是你要运行的部分。
终止条件——啊也很好理解,你总不能像个俄罗斯套娃似的,自己里面套自己,自己里面的自己还套自己……无限循环下去吧。
递归还有一个循环的衍生版,叫递推,下面是用递推做的斐波那契数列:
int a[10010] = {0 ,1, 1};
int main() {
int n;
scanf("%d", &n);
for (int i = 3; i <= n; i++) {
a[i] = a[i - 1] + a[i - 2];
}
printf("%d", a[n]);
}
这种,会更快,因为它不用再重复计算前两项是多少,也就是说,刚刚那个递归是重复计算了很多不必要的数字的,而这个递推是直接把前两项保存下来,直接拿出来用。光看这段文字都觉得递推好很多是不是?
当然,递归也有优化版本,这里就不写出来了。
那二叉树,是什么呢?就像这样:
这就是一个典型的二叉树。
你看,这不就是分裂麻。
那这玩意很递归有什么关系捏?
你看啊,自己里面套自己,然后到最后一层一层的往前面走。
这不就是递归吗?
这里也不多讲,你可以去百度找一下下相关的文献。
尾声/作者的话
那这递归啊,就讲到这。
我也不是一个很厉害的程序员,每天就是在洛谷刷刷题,打打暴力(悲
行吧,那我走了,你自己再慢慢研究一下吧。