递归:基础例题分析(及动态规划)
Posted 记录java路上的小问题
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了递归:基础例题分析(及动态规划)相关的知识,希望对你有一定的参考价值。
题目:一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法?
这道题,用递归的方法做题。最重要是找出这个函数与下一个函数之间的关系以及一个函数体结束的临界条件(递归的结束)。
解题思路:
1.第一步先找出这个函数与下一个函数之间的关系:
假如有n个台阶,跳上一个n级的台阶的跳法总数为f(n)。
在跳的过程中,每次有两种跳法,即跳一个或者两个台阶。
第一种跳法:第一次跳一个台阶,那么还剩下n-1个台阶还没跳,剩下的n-1个台阶的跳法有f(n-1)种。
第二种跳法:第一次跳两个台阶,那么还剩下n-2个台阶还没跳,剩下的n-2个台阶的跳法有f(n-2)种。
由此得出递归公式:f(n)=f(n-1)+f(n-2);
2.第二步,找出递归的结束条件
当n<=0时,跳法为0,即f(0)=0;
当只剩下一个台阶n=1时,那么只有一种跳法,即f(1)=1;
当剩下两个台阶n=2时,此时跳法为两种,即f(2)=2;
函数与函数之间的关系以及递归的临界条件都找出来了,接下来转换成java代码。如下所示:
递归的过程中:
由此:2+1+2=5。当4个台阶时,跳法一共有5种。
--------------------------------------------------------------------------------------
观察一下你就会发现,其实在递归的过程中,有很多相同的f(n)重复计算。
因此对于那些重复计算过的,可以不用在重复递归来算他,也就是可以把f(n)算的结果一边给保存起来,这种就是动态规划的思想。
也就是说,可以把每次计算的结果保存到一个map容器中,把n作为key,f(n)作为value。然后每次要递归的时候,先查看这个f(n)是否已经算过了,如果已经算过,直接从map容器里面取出来返回。如下:
这种方法会快很多!!!
以上是关于递归:基础例题分析(及动态规划)的主要内容,如果未能解决你的问题,请参考以下文章