求斐波那契数列第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}