剑指offer_10_斐波那契数列
- 2019 年 10 月 6 日
- 筆記
题目:求斐波那契数的第n项
描述:写一个函数,输入n,求斐波那契数的第n项,斐波那契数的定义如下
{ 0 n = 0 f(n) = { 1 n = 1 { f(n - 1) + f(n - 2) n > 1
说白了就是从第二项开始,每项都是前两项的和:
0 1 1 2 3 5 8 13 21.....
第一种方法递归:
public static int fibonacci(int number) { if(number < 0) { return 0; } if (number <= 1) { return number; } return fibonacci(number-1) + fibonacci(number -2); }
第二种方法动态规划1:
public static int fibonacci2(int number) { if (number < 0) { return 0; } if (number <= 1) { return number; } int[] arr = new int [number + 1]; arr[0] = 0; arr[1] = 1; for (int i = 2; i <= number; i++) { arr[i] = arr[i-1] + arr[i-2]; } return arr[number]; }
第二种方法动态规划2:
publicstatic int fibonacci(int number) { if (number < 0) { return 0; } if (number <= 1) { return number; } int[] arr = new int [3]; arr[0] = 0; arr[1] = 1; for (int i = 2; i <= number; i++) { // 这里是为了节约空间 循环利用数组 arr[i % 3] = arr[(i-1) % 3] + arr[(i-2) % 3]; } return arr[number % 3]; }
总结:递归方法在求当n很大的时候会占用很大的栈空间,效率比较低,不足以拿到offer,建议用动态规划。
相关的题目还有:青蛙跳台阶问题、矩形覆盖问题等。