跳台阶问题(牛客网--剑指offer)

转载请注明:https://blog.csdn.net/u012572354/article/details/89553636

能力有限,如有问题请指出,共享知识,谢谢!

题目描述

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

分析:

设跳到第n-2和n-1个台阶跳法为y(n-2)y(n-1),跳到第n阶楼梯有2种,从分别第n-2和n-1个台阶跳2个和1个台阶。则跳到第n阶楼梯的跳法为y(n)=y(n-2)+y(n-1)(n\geq 2)y(0)=1y(1)=1。台阶的跳法满足斐波那契数列f(n),(n\geq =0),f(0)=0,f(1)=1。则y(n)=f(n+1),(n>=0)。跳法:y(1)=1y(2)=2y(3)=3

斐波那契数列的通项公式:

f(n)=\frac{\sqrt{5}}{5}\left (\left (\frac{1+\sqrt{5}}{2} \right )^{n} - \left (\frac{1-\sqrt{5}}{2} \right )^{n} \right ),(n\geq 0)

则跳台阶通项公式:

y(n)=f(n+1)=\frac{\sqrt{5}}{5}\left (\left (\frac{1+\sqrt{5}}{2} \right )^{n+1} - \left (\frac{1-\sqrt{5}}{2} \right )^{n+1} \right ) ,(n\geq 0)

解法1: 

采用通向公式编程。

# -*- coding:utf-8 -*
import math
class Solution:
    def jumpFloor(self, number):
        # write code here
        s=math.sqrt(5)
        a=pow((1+s)/2.0,number+1)
        b=pow((1-s)/2.0,number+1)
        y=math.floor(s/5.0*(a-b))
        return y
wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==

解法2:

采用迭代法,y(n)=y(n-2)+y(n-1)。由于计算机对递归太敏感,会造成超时,一般要避免采用递归方法。

# -*- coding:utf-8 -*-
class Solution:
    def jumpFloor(self, number):
        # write code here
        a=1
        b=1
        for i in range(1,number):
            if number==1:
                return b
            else:
                a, b = b, a+b
        return b

斐波那契数列的通项公式求解

对于f(n)=f(n-2)+f(n-1),对应方程x^{2}=x+1,求解

\left\{\begin{matrix} x_{1} =\frac{1+\sqrt{5}}{2} \\ x_{2} =\frac{1-\sqrt{5}}{2} \end{matrix}\right.

f(n)=C_{1}x_{1}^{n}+C_{2}x_{2}^{n}f(0)=1,f(1)=1,求出C_{1}=\frac{\sqrt{5}}{5}C_{1}=-\frac{\sqrt{5}}{5}

                    f(n)=\frac{\sqrt{5}}{5}\left (\left (\frac{1+\sqrt{5}}{2} \right )^{n} - \left (\frac{1-\sqrt{5}}{2} \right )^{n} \right ),(n\geq 0)

斐波那契数列的如何推导通项公式?如何对应的方程x^{2}=x+1

对于斐波那契数列,x(0)=0,x(1)=1,x(2)=1,x(3)=2x(n)=x(n-1)+x(n-2),令

            x(n)-tx(n-1)=s(x(n-1)-tx(n-2))t,s为常系数,此为等比数列。

             x(n)=(t+s)x(n-1)-stx(n-2),则\left\{\begin{matrix} t+s=1 \\ st=-1 \end{matrix}\right.

则等比数列,

                x(n)-tx(n-1)=(x(1)-x(0))s^{n-1}

假设存在t_{1},s_{1}t_{2},s_{2},且t_{1}\neq t_{2},s_{1}\neq s_{2},满足\left\{\begin{matrix} t+s=1 \\ st=-1 \end{matrix}\right.,则

                \left\{\begin{matrix} x(n)-t_{1}x(n-1)=(x(1)-x(0))s_{1}^{n-1} \\ x(n)-t_{2}x(n-1)=(x(1)-x(0))s_{2}^{n-1} \end{matrix}\right.

                x(n-1)=\frac{x(1)-x(0)}{t_{2}-t_{1}}(s_{1}^{n-1}-s_{2}^{n-1})

因此,

               x(n)=\frac{x(1)-x(0)}{t_{2}-t_{1}}(s_{1}^{n}-s_{2}^{n}) =C_{1}s_{1}^{n}+C_{2}s_{2}^{n}

由于t_{1},s_{1}t_{2},s_{2}满足\left\{\begin{matrix} t+s=1 \\ st=-1 \end{matrix}\right.,假设t\neq 0,s\neq 0,则等价于方程s-\frac{1}{s}=1, 简化s^{2}-s=1。存在解s_{1},s_{2}满足方程。故斐波那契数列x(n)=x(n-1)+x(n-2)对应的特征方程为:

                                         x^{2}=x+1

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值