斐波那契数列

参考:剑指offer

  1. 写一个函数,输入n, 求斐波那契数列的第n项。
  2. 一只青蛙一次可以跳上1级台阶,也可以跳上2级台阶。求该青蛙跳上一个n级的台阶总共有多少种跳法。
  3. 我们可以用2×1的小矩形横着或竖着去覆盖更大的矩形。请问用8个2×1的小矩形横着或竖着无重复地覆盖一个2×8的大矩形,总共有多少种方法。

1、思路:

  不建议用递归,因为会重复计算。依次叠加往上计算,动态规划的思想。

Fib
 1 #include <stdio.h>
 2 
 3 long long Fib(unsigned int n)
 4 {
 5     int result[2] = {0, 1};
 6     if (n < 2)
 7         return result[n];
 8     long long num1 = 0;
 9     long long num2 = 1;
10     long long temp;
11     for (unsigned int i = 2; i <= n; i++)
12     {
13         temp = num2;
14         num2 = num1 + num2;
15         num1 = temp;
16     }
17     return num1;
18 }
19 
20 int main()
21 {
22     int n = 6;
23     int result = Fib(n);
24     printf("result: %d\n", result);
25 }

 

2、思路:

  首先考虑简单情况。1级台阶,只有1种跳法;2级台阶,只有2种跳法;3级台阶,有3中跳法;4级台阶,有5种跳法...

  再来讨论一般情况。f(n)表示n级台阶的跳法。对于n级台阶的最后一跳有两种选择:当最后一跳是1级时,此时跳法数目等于前面的n-1级台阶的跳法数目;当最后一跳是2级时,此时跳法数目等于前面的n-2级台阶的跳法数目。所以f(n)=f(n-1)+f(n-2),就是斐波那契数列。

 

3、思路:

  我们把2×8的覆盖方法记为f(8)。用第一个小矩形去覆盖大矩形的最左边有两种选择,一种是竖着放,右边剩下2×7的区域;另一种是横着放,右边剩下2×6的区域。所以f(8)=f(7)+f(6)。

  

转载于:https://www.cnblogs.com/wangpengjie/archive/2013/03/29/2988493.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值