问题:一青蛙一次可以跳一个台阶,也可以跳两个,当跳到第n级时,有多少中跳法?
解析:
设青蛙跳到第n级时有Jump(n)种跳法
我们可以倒着看问题,当青蛙跳到第n阶时,它最后一跳有两种跳法,一种是跳了一阶,从n-1阶跳到了n阶,另一种是跳了两阶,从n-2阶跳到了n阶
青蛙跳到第n-1级时有Jump(n-1)种跳法,跳到第n-2级时有Jump(n-2)种跳法
所以Jump(n) = Jump(n - 1) + Jump(n - 2)
其实就是一个斐波拉契数列:
当n=1时,Jump(n)=1
当n=2时,Jump(n)=2
当n>2时,Jump(n) = Jump(n - 1) + Jump(n - 2)
因此我们可以使用递归方法解决问题:
代码很简单,只需要按公式写就好了——
但是使用这种方法有一个问题就是,当n的数目很大时,会出现非常大量的重复计算,比如我们要计算Jump(48) ,我们就必须计算Jump(47)、Jump(46),要计算Jump(47)就要计算Jump(46)和Jump(45),多推几个就会发现由此产生了大量的重复,效率非常低。
所以我们还可以用迭代的方法解决问题:
这次我们来正向计算这个问题,要求跳到某一阶的跳法,其实只需要把它前面在前面两阶各自的跳法加起来就好了,然后我们已经知道了跳到第一阶有一种跳法,跳到第二阶有两种跳法,那么自然跳到第三阶的跳法就有1+2=3种,剩下的要做的就是不停地加最后两项,不断得到下一项,最后得到n阶时的跳法。
所以,当n大于2时,我们利用一个while循环,设a,b,c,令a,b作为最后两项,c作为最后一项,a的初始值为1,b的初始值为2,让c=a+b,然后再把b的值赋给a,c的值赋给b,这样就更新了最后两项的值,以便实现下一次循环。
为了让循环顺利进行,我们每次循环都要把n减掉1,这样当n=2的时候,循环就会停止,也就是一共循环了n-2次,而n-2次循环后我们得到的跳法个数正是我们需要的Jump(n)!
代码如下: