题目一
给定一个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 的大矩形,有几种方案。
也是斐波那契数列