动态规划可以理解为是查表的递归。那么什么是递归?
递归
定义:递归算法是一种直接或者间接调用自身函数或者方法的算法。
算法中使用递归可以很简单地完成一些用循环实现的功能,比如二叉树的左中右序遍历。递归在算法中有非常广泛的使用, 包括现在日趋流行的函数式编程。
纯粹的函数式编程中没有循环,只有递归。
接下来我们来讲解一下递归。通俗来说,递归算法的实质是把问题分解成规模缩小的同类问题的子问题,然后递归调用方法来表示问题的解
递归的三个要素
一个问题的解可以分解为几个子问题的解
子问题的求解思路除了规模之外,没有任何区别
有递归终止条件
我这里列举了几道算法题目,这几道算法题目都可以用递归轻松写出来:
递归实现 sum
二叉树的遍历
走楼梯问题
汉诺塔问题
动态规划
如果说递归是从问题的结果倒推,直到问题的规模缩小到寻常。那么动态规划就是从寻常入手, 逐步扩大规模到最优子结构。
这句话需要一定的时间来消化, 如果不理解,可以过一段时间再来看。
递归的解决问题非常符合人的直觉,代码写起来比较简单。但是我们通过分析(可以尝试画一个递归树),可以看出递归在缩小问题规模的同时可能会 重复计算。279.perfect-squares[1] 中 我通过递归的方式来解决这个问题,同时内部维护了一个缓存 来存储计算过的运算,那么我们可以减少很多运算。这其实和动态规划有着异曲同工的地方。
我们结合求和问题来讲解一下, 题目是给定一个数组,求出数组中所有项的和,要求使用递归实现。
代码:
function sum(nums) {
if (nums.length === 0) return 0;
if (nums.length