青蛙跳台阶进阶版证明和代码

1、背景

\qquad 最近在看《剑指offer(第二版)》时,Fibonacci数列一节中提到了青蛙跳台阶的进阶版,问题描述为:一只青蛙一次可以跳上1级台阶,2级台阶…,也可以跳上n级台阶,问青蛙跳上n级台阶共有多少中跳法?书中提到了用数学归纳法可以证明跳的方法有 f ( n ) = 2 n − 1 f(n)=2^{n-1} f(n)=2n1种,本人杠精非要运用高中知识给其证明一下子,然后再给出求解代码。

2、简单的数学归纳法证明

\qquad 其实这东西证明很简单,只是大家可能忘记高中的知识了,下面给出数学归纳法证明。首先分析一下跳上n级台阶的方法数 f ( n ) f(n) f(n)的表达式应该为:
f ( n ) = f ( n − 1 ) + f ( n − 2 ) + . . . + f ( 1 ) + f ( 0 ) f(n)=f(n-1)+f(n-2)+...+f(1)+f(0) f(n)=f(n1)+f(n2)+...+f(1)+f(0) \qquad 简要分析一下上式:因为青蛙如果先跳1级台阶,则剩余跳法为 f ( n − 1 ) f(n-1) f(n1);若先跳2级台阶,则剩余跳法为 f ( n − 2 ) f(n-2) f(n2);以此类推,到先跳n级台阶,则剩余跳法为 f ( 0 ) f(0) f(0),注意一下此处 f ( 0 ) = = f ( 1 ) = = 1 f(0)==f(1)==1 f(0)==f(1)==1
\qquad 获得上式之后就可以开始推导了,首先进行移项处理: f ( n ) − f ( n − 1 ) = f ( n − 2 ) + . . . + f ( 1 ) + f ( 0 ) f(n)-f(n-1)=f(n-2)+...+f(1)+f(0) f(n)f(n1)=f(n2)+...+f(1)+f(0) \qquad 然后我们可以惊奇的发现等号右端项就是 f ( n − 1 ) f(n-1) f(n1),因此我们可以得到下式: f ( n ) − f ( n − 1 ) = f ( n − 1 ) → f ( n ) = 2 ∗ f ( n − 1 ) f(n)-f(n-1)=f(n-1)→f(n)=2*f(n-1) f(n)f(n1)=f(n1)f(n)=2f(n1),然后下面就可以开始高中数学题了,嘿嘿嘿。
f ( n ) = 2 ∗ f ( n − 1 ) f ( n − 1 ) = 2 ∗ f ( n − 2 ) f ( n − 2 ) = 2 ∗ f ( n − 3 ) . . . . . . f ( 2 ) = 2 ∗ f ( 1 ) f ( 1 ) = 1 ∗ f ( 0 ) f(n)=2*f(n-1)\\f(n-1)=2*f(n-2)\\f(n-2)=2*f(n-3)\\...\\...\\f(2)=2*f(1)\\f(1)=1*f(0) f(n)=2f(n1)f(n1)=2f(n2)f(n2)=2f(n3)......f(2)=2f(1)f(1)=1f(0) \qquad 到这里可能大家就明白了,把所有的等式进行累乘,之后因为 f ( 0 ) = = f ( 1 ) = = 1 f(0)==f(1)==1 f(0)==f(1)==1,所以只有 n − 1 n-1 n1个2相乘,最终得到: f ( n ) = 2 n − 1 f(n)=2^{n-1} f(n)=2n1

3、求解代码

\qquad 就是把上述表达式进行代码化就行咯,有点侮辱智商的意思。

long long FrogJump(int n)
{
	return (long long)pow(2, n-1);
}

THE END

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Dragon Fly

多谢老板赏钱[抱拳抱拳抱拳]

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

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

打赏作者

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

抵扣说明:

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

余额充值