青蛙跳台阶问题讨论

题引:

斐波那契数列:

斐波那契数列,又称黄金分割数列,指的是这样一个数列:

0、1、1、2、3、5、8、13、21、34、…在数学上,斐波纳契数列以如下被以递归的方法定义:

F(0)=0,F(1)=1, F(n)=F(n-1)+F(n-2)(n>=2,n∈N*);

斐波那契数列指的是这样一个数列 :

0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233,377,610,987,1597,2584,4181,6765,

10946,17711,28657,46368

特别指出:第0项是0,第1项是第一个1。

这个数列从第2项开始,每一项都等于前两项之和。

输出第n个斐波那契数,不考虑溢出n的定义域是n>=0;

0 1 1 2 3 5 8 13 21 34 55......,,就是前两个数之和等于第三个数,求第n个。

斐波那契数想要成立,前面必须要有两个数字,这样才能正常的有第三个数成立,所以,n>=2,

假设函数Fib是求斐波那契数的函数。

所以有:Fib(n);

其中,当n=0的时候,  Fib(n)=0;

           当n=1的时候,  Fib(n)=1;

           当n>=2的时候,Fib(n)=Fib(n-2)+Fib(n-1);

如果求Fib(50),此时代码一直在跑,但是需要很长时间,该代码太重复,进行了大量的计算,

如果要求fib(50),根据公式,就必须先求出来,fib(49),fib(48),,如果要求fib(49),又

必须要知道fib(48),fib(47),,这时候就已经求了两次fib(48),所以,一直推下去,要求fib

(50),肯定会有一些值重复被计算,从而导致代码执行起来很慢。

可以看出,count的数值特别的大,因此,计算非常复杂,,,不宜采用递归的方法。

此时,递归里面也有两个充要条件,但是递归层次很深,为什么没有产生栈溢出,这是因为,他不

是死递归,所以递归层次还是不够深;

递归不合适的话,就要想到用循环去解决问题。

因为整型int是有限的,如果数值太大,就会出现错误,但是这种方法的效率是非常高的,,可以用

long long但是long long也有自己的上限,再大的话又解决不了了;如果要算一个超大的数字,,要

专门写代码来实现,而不可用内置类型;

 所以:代码可以用递归也可以用非递归来写,有时递归会导致栈溢出或者效率低,所以要想到用

迭代来写。如果用递归的方法有明显的缺陷,就必须用迭代的方法来写。

青蛙跳台阶问题:

青蛙跳台阶问题,不考虑台阶数为负数或者0的情况,即此类问题,台阶数的取值范围是: n>=1;

一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法

(1 ≤ n ≤ 30,先后次序不同算不同的结果)。

如果n=0,只有0种跳法,那就是,不考虑n=0的情况;

如果n=1,只有一种跳法,那就是1

如果n=2,那么有两种跳法,2,[1,1]

如果n=3,那么有三种跳法,[1,1,1],,[1,2],[2,1]

如果n=4,那么有五种跳法,[1,1,1,1],[1,1,2],[1,2,1],[2,1,1],[2,2]

如果n=5,那么有八种跳法,[1,1,1,1,1],[1,1,1,2],[1,1,2,1],[1,2,1,1],[2,1,1,1],[2,2,1],[2,1,2],[1,2,2]

结果为1,2,3,5,8 这就是斐波那切数列的变形嘛;

法一:

递归:

法二:

循环:

 特别注意:

青蛙跳台阶问题,只有,青蛙每次能跳一个或两个台阶的时候,才会与斐波那契数列产生关系,而

这个关系还不是完全一样的,,是改进的斐波那契数列,,当青蛙能够跳的台阶数不再只是1或2

如:1,2,3,...1,2,3,4等等,即,不再只是能够跳1或2的时候,,此时产生的结果和斐波那契数列

完全不一样的,,也就是说,,其他情况下就和斐波那契数列无关了,,只是在1或2的时候,才

会与斐波那契数列沾边,还不是完全一样,,既然如此,,我们就干脆把斐波那契数列和青蛙跳台

阶问题分成两部分来看,不要当做一种题来做;

青蛙跳台阶问题,通过观察多种情况可知,,我们可以分成两个部分

即,告知的青蛙跳台阶的个数明确的数字或者是不明确的数字两部分

不管哪一部分,我们都可以把暂时的通式写出来:

一、

如果青蛙可以跳1或2个台阶这明确的数字暂时的通式就是:

Fib(n)= Fib(n-1)+Fib(n-2);

如果青蛙可以跳1或2或3个台阶这明确的数字暂时的通式就是:

Fib(n)= Fib(n-1)+Fib(n-2)+Fib(n-3);

二、

如果青蛙能够跳1,2,3....n个这不明确的数字台阶,暂时的通式就是:

Fib(n)= Fib(n-1)+Fib(n-2)+Fib(n-3)+.....Fib(n-n);

如果青蛙能够跳1,2,3....m个这不明确的数字台阶暂时的通式就是:

Fib(n)= Fib(n-1)+Fib(n-2)+Fib(n-3)+.....Fib(n-m);

不同的是,,青蛙所跳的台阶数,如果是明确的,暂时的通式就可以直接拿去当最终的通式去使

,如果青蛙所跳的台阶数,不是明确的,可以改变的,要根据暂时的通式写出来Fib(n-1),把

Fib(n-1)整合到Fib(n)里面,得到一个最终的通式Fib(n),再拿该最终的通式去使用才行;

1、

如果告知的青蛙跳台阶的个数是明确的数字,比如,青蛙能够跳1或2,个台阶,1或2或3个台阶,,

这些明确的数字,,我们的递归通式就是:

Fib(n)= Fib(n-1)+Fib(n-2) 或 Fib(n)= Fib(n-1)+Fib(n-2)+Fib(n-3),这样的话,

Fib(n)= Fib(n-1)+Fib(n-2)就要保证,该项之前必须至少要有2项,,

Fib(n)= Fib(n-1)+Fib(n-2)+Fib(n-3)该项之前必须至少要有3项,,

即,n>2,和n>3,,前面的项自己去按具体要求计算即可;

2、

如果告知的青蛙跳台阶的个数不是个明确的数字,,比如,青蛙能跳1,2,3...n个台阶,求跳上n个

台阶有几种方法,或者比如:青蛙能跳1,2,3...m个台阶,求青蛙跳上n个台阶有几种方法,,像这

种,我们不明确青蛙到底能跳几个台阶,因为,青蛙能够跳n个,m个台阶是个变量,,这种情

况,就要先写出来:Fib(n)= Fib(n-1)+Fib(n-2)+Fib(n-3)+.....Fib(n-n)Fib(n)=

Fib(n-1)+Fib(n-2)+Fib(n-3)+.....Fib(n-m),然后再分别写出来对应的Fib(n-1),再把

Fin(n-1)整合到与自己对应的Fib(n)里面去,得到最终的通式Fib(n),然后再去使用;

现在再来看青蛙跳台阶问题:

一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法(1 ≤ n ≤ 30,先后次序不同算不同的结果)。

如果n=1,只有一种跳法,那就是1

如果n=2,那么有两种跳法,2,[1,1]

如果n=3,那么有三种跳法,[1,1,1],,[1,2],[2,1]

如果n=4,那么有五种跳法,[1,1,1,1],[1,1,2],[1,2,1],[2,1,1],[2,2]

如果n=5,那么有八种跳法,[1,1,1,1,1],[1,1,1,2],[1,1,2,1],[1,2,1,1],[2,1,1,1],[2,2,1],[2,1,2],[1,2,2]

结果为1,2,3,5,8 ...

已知,青蛙跳台阶的个数是明确的,,所以,通式就是:Fib(n)= Fib(n-1)+Fib(n-2)

要想使用该通式,就必须要保证n>=3,,前面必须要有两项,前面两项可以根据规律来写,上面

有图片;

拓展:

一只青蛙一次可以跳上1级台阶,也可以跳上2级,也可以跳上3阶级……也可以跳上n-1级台阶,它也可以跳上n级。求该青蛙跳上一个n级的台阶总共有多少种跳法。

由题意可知,,青蛙跳台阶的个数不是明确的,要先写出来暂时的通式:

Fib(n)= Fib(n-1)+Fib(n-2)+Fib(n-3)+.....Fib(n-n)

              =Fib(0) + Fib(1) +Fib(2) + Fib(3) + ... + Fib(n-2)+Fib(n-1)

Fib (n-1) = Fib(0) + Fib(1)+Fib(2)+Fib(3) + ... +Fib((n-1)-1)

               = Fib(0) + Fib(1) + Fib(2) +Fib(3) + ... +Fib(n-2)

所以: Fib(n)=2*Fib(n-1);

如果n=1,只有一种跳法,那就是1;

如果n=2,只有二种跳法,那就是2;

如果n=3,只有四种跳法,那就是4;

如果n=4,只有八种跳法,那就是8;

如果n=5,只有十六种跳法,那就是16;

所以应该是:1,2,4,8,16.....

则:

拓展2:

一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上m级。求该青蛙跳上一个n级

台阶总共有多少种跳法。

由题意可知,青蛙跳台阶的个数是不明确的,先写出暂时的通式

Fib(n) = Fib(n-1) +Fib(n-2) + Fib(n-3) + ... + Fib(n-m)

再写出:

Fib(n-1) = Fib(n-2) +Fib(n-3) + ... + Fib(n-m) + Fib(n-m-1)

化简整合得:Fib(n) = 2*Fib(n-1) -Fib(n-m-1);

当n<=m时和上题是一样的;

当n>m的时候,就要用刚才得到的最终的通式去计算:

今天的分享到此结束,谢谢大家点赞关注哦~

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

脱缰的野驴、

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值