求斐波那契数列第N位的值
300 Words|Read in about 1 Min|本文总阅读量次
求斐波那契数列第N位的值。采用双指针迭代方法。
斐波那契数列
每一位的值等于他前两位数字之和。前两位固定0,1,1,2,3,5,8…
求斐波那契数列第N位的值
求解斐波那契数组
1暴力递归
时间复杂度o(n^2^)
1public static int calculate(int num)
2{
3 if(0 == num)
4 {
5 return 0;
6 }
7
8 if(1 == num)
9 {
10 return 1;
11 }
12
13 return calculate(num - 1) + calculate(num - 2);
14}
2去重递归
因为虽然上面直接递归操作可以满足,但是出现了很多重复计算的步骤.
时间复杂度o(n)
,空间复杂度o(n)
1//通过数组的形式
2public static int calculate(int num)
3{
4 int[] arr = new int[num + 1];
5 return recurse(arr, num);
6}
7
8private static int recurse(int[] arr, int num)
9{
10 if(0 == num)
11 {
12 return 0;
13 }
14
15 if(1 == num)
16 {
17 return 1;
18 }
19
20 if(arr[num] != 0)
21 {
22 return arr[num];
23 }
24 arr[num] = recurse(arr, num - 1) + recurse(arr, num - 2);
25 return arr[num];
26}
双指针迭代
进一步优化,其实只需要两个变量(双指针)就可以
时间复杂度o(n)
,空间复杂度o(1)
1//双指针迭代
2public static int calculate(int num)
3{
4 if(0 == num)
5 {
6 return 0;
7 }
8
9 if(1 == num)
10 {
11 return 1;
12 }
13
14 int low = 0;
15 int high = 1;
16 for(int i = 2; i < num; i++)
17 {
18 int sum = low + high;
19 low = high;
20 high = sum;
21 }
22
23 return high;
24}