【剑指offer】10、斐波那契数列

题目一

给定一个n,输出斐波那契数列的第n项

思路1

递归,自顶而下,但会有很多重复,效率低,AC不了

int Fibonacci(int n) {
    if (n <= 0)
        return 0;
    if (n == 0)
        return 1;
    return Fibonacci(n-1) + Fibonacci(n-2);
}

思路2

自下而上计算,AC

int Fibonacci(int n) {
  int result = 0;
  if (n < 2) return n;
  int x1 = 0, x2 = 1;
  for (int i = 2;i <= n; i++)
  {
    result = x1 + x2;
    x1 = x2;
    x2 = result;
  }
  return result;
}

题目二

一只青蛙可以跳上1级台阶,也可以跳上2级台阶。求青蛙跳上一个n级台阶共有多少方案。

思路

这个相当于把n分解成1和2的排列,如 3 = 1 + 1 + 1, 3 = 1 + 2, 3  = 2 + 1,从组合数学角度来看已知是斐波那契数列

也可从递推公式看 f(n) = f(n-1) + f(n-2), 这也就是动态规划

代码同上。

题目三

一只青蛙可以跳上1级,2级...,n级台阶,请问跳上一个n级台阶的方案。

思路

f(n) = f(n-1) + f(n-2) + ...+ f(0) = 2f(n-1)

f(n) = 2n-1, f(1) = 1

int jumpFloorII(int number) {
    if (number <= 1) return number;
  int res = 1;
  for (int i = 2; i <= number; i++)
  {
    res = 2 * res;
  }
  return res;
}

题目四

用2×1的小矩形横着或者竖着覆盖 2×8 的大矩形,有几种方案。

               
               

 

 

也是斐波那契数列

 

猜你喜欢

转载自www.cnblogs.com/shiganquan/p/9283106.html
今日推荐