怎么理解递归
举个例子,比如求100的阶乘吧
可以求
而
......
最后到1就结束了
递归代码最重要的两个特征,结束条件和自我调用。自我调用是在解决子问题,而结束条件定义了最简子问题的答案
自我调用,我们一直在求某个数的阶乘,结束条件,求到1就结束
递归的优点:代码清晰
递归的缺点:每次调用栈会增加额外空间,还有可能会栈溢出。以及有时候写动态规划的优化,还真得用迭代,个人建议除非迭代很难理解,不然能用迭代就用迭代吧
分治
分治是一种算法思想,而递归像是一种工具,分治分为三步,分解 -> 解决 -> 合并。
拿归并排序来举例
void merge_sort(一个数组) {
if (可以很容易处理) return;
merge_sort(左半个数组);
merge_sort(右半个数组);
merge(左半个数组, 右半个数组);
}
先把整个数组,先分成两组,分别排序这两组,由于左右数组都是有序的,可以再合并两个有序数组,速度会更快