递归&分治

54 阅读1分钟

怎么理解递归

举个例子,比如求100的阶乘吧

可以求 99!10099! * 100

99!=98!9999! = 98! * 99

......

最后到1就结束了

递归代码最重要的两个特征,结束条件和自我调用。自我调用是在解决子问题,而结束条件定义了最简子问题的答案

自我调用,我们一直在求某个数的阶乘,结束条件,求到1就结束

递归的优点:代码清晰

递归的缺点:每次调用栈会增加额外空间,还有可能会栈溢出。以及有时候写动态规划的优化,还真得用迭代,个人建议除非迭代很难理解,不然能用迭代就用迭代吧

分治

分治是一种算法思想,而递归像是一种工具,分治分为三步,分解 -> 解决 -> 合并。

拿归并排序来举例

void merge_sort(一个数组) { 
    if (可以很容易处理) return; 
    merge_sort(左半个数组); 
    merge_sort(右半个数组); 
    merge(左半个数组, 右半个数组); 
}

先把整个数组,先分成两组,分别排序这两组,由于左右数组都是有序的,可以再合并两个有序数组,速度会更快

例题

leetcode.cn/tag/divide-…