一文彻底搞懂递归、备忘录、动态规划

  • 递归:

        递归算法是一类非常常用的算法,它是一种直接或间接调用原算法本身的算法。递归算法最大的特点就是“自己调用自己”,对于一些具有递归特性的问题,使用递归算法来解决会更加简单明了,且易于实现。

        在使用递归算法解决实际的问题时,要自顶向下地将一个大问题拆分成同类的小问题,然后利用同类问题这一特性构造出解决问题的递归函数,也就是这种“自己调用自己”的模型,再通过程序实现这个递归函数。

图片

         下面通过一个实例理解递归算法。

        走楼梯问题:一个楼梯共有10级台阶,一个人从下往上走,他可以一次走一个台阶,也可以一次走两个台阶。请问这个人有多少种走法走完这10级台阶?

        这是一道经典而有趣的算法题,本题有很多种解法,其中最为经典而简洁的解法是使用递归算法解决。我们先来看一下如何使用递归法求解此题。

        因为这个人一次可以走一个台阶,也可以走两个台阶,所以他可以有很多种组合方法走完这10级台阶。例如可以如图(1)所示这样上楼:

        走法一:1--> 1-->1--> 1-->1--> 1-->1--> 1-->1--> 1,如图(1)所示:

图片

也就是每步都走一个台阶。

可以如图(2)所示这样上楼:

走法二:2-->1--> 1-->1--> 1-->1--> 1-->1--> 1,如图(2)所示。

图片

        也就是先上两级台阶,再一步一个台阶地上8个台阶。

        这样看来,这个人可以有很多种方式走完这10个台阶,那么我们要如何计算共有多少种走法呢?

        试想如果这个人要走到第10级台阶,必然存在且仅存在以下两种情形:

        (1)此人先登到第8级台阶上,然后在第8级台阶处向上直接登2个台阶,而不经过第9级台阶,如图(3)所示;

 (2)此人登上了第9级台阶,再向上登1级台阶即可到顶,如图(4)所示。

图片

         有的读者可能会有这样的质疑:“此人

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值