斐波那契数列

参考:剑指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)。

  

posted on 2013-03-29 11:09  月moon鸟  阅读(259)  评论(0编辑  收藏  举报

导航