斐波那契数列

本次程序可以获取斐波那契数列任意位置上的数字。

要怎样实现呢?用递归就可以了。

先上代码:

 1 package com.hw.list0710;
 2 
 3 import java.util.Scanner;
 4 
 5 public class Fibonacci {
 6     private int calculate(int num){
 7         if(num == 0){
 8             return 0;
 9         }else if(num == 1){
10             return 1;
11         }else{
12             int a = calculate(num-1);
13             int b = calculate(num-2);
14             return a+b;
15         }
16     }
17 
18     public static void main(String[] args) {
19         Fibonacci fib = new Fibonacci();
20         System.out.println("输入你想要在斐波那契数列中查找的位置索引:");
21         Scanner s = new Scanner(System.in);
22         int index = s.nextInt();
23         s.close();
24         int res = fib.calculate(index);
25         System.out.println(res);
26     }
27 }

具体的递归代码在calculate函数里,思路很简单。

不过仔细一想会发现其实这有个问题,那就是,有很多数其实重复计算了。比如说我要计算num,那么就肯定会计算num-1和num-2,num-1肯定就会计算num-2和num-3,num-2一定会计算num-3和num-4,那么这个时候,在计算num-1时,我已经计算出num-2了,那么后面我还有必要计算num-3和num-4吗?所以我们就应该想个办法改善一下我们的思路。

我们可以用一个数组来做标记(敲黑板,又一次用到了这种思想!)。先初始化一个num+1长度的数组,里面肯定默认全为0.只要计算了某一个值,我们就修改在数组中的值,然后判断一下就可以了。

 1 package com.hw.list0710;
 2 
 3 import java.util.Scanner;
 4 
 5 public class Fibonacci {
 6     private int calculate(int num){
 7         int[] arr = new int[num+1];
 8         return recursion(arr, num);
 9     }
10 
11     private static int recursion(int[] arr, int num){
12         if(num == 0){
13             return 0;
14         }else if(num == 1){
15             return 1;
16         }
17         
18         if(arr[num] != 0){  //这里是不重复计算的关键
19             return arr[num];
20         }
21 
22         arr[num] = recursion(arr, num-1) + recursion(arr, num-2);
23         return arr[num];
24     }
25 
26     public static void main(String[] args) {
27         Fibonacci fib = new Fibonacci();
28         System.out.println("输入你想要在斐波那契数列中查找的位置索引:");
29         Scanner s = new Scanner(System.in);
30         int index = s.nextInt();
31         s.close();
32         int res = fib.calculate(index);
33         System.out.println(res);
34     }
35 }


 

 其实,我们还可以用双指针法来解决这个问题。

用双指针法的话,我们其实不需要用数组来实现了。我们同样定义快慢两个指针,然后慢指针指向数列的第一个元素,即0,快指针指向第二个元素,即1.然后定义一个和sum,这个和等于快慢指针的和。然后更新快慢指针的值,这个过程何时终止?取决于用户输入的数。

来看看代码:

 1 package com.hw.list0710;
 2 
 3 import java.util.Scanner;
 4 
 5 public class Fibonacci {
 6     public static int getValue(int num){  //双指针法求斐波那切数列的通项
 7         if(num == 0){
 8             return 0;
 9         }
10         if(num == 1){
11             return 1;
12         }
13 
14         int sum = 0;
15         int low = 0,high = 1;
16         for(int i = 2;i <= num;++i){
17             sum = low + high;
18             low = high;
19             high = sum;
20         }
21         return high;
22     }
23 
24     public static void main(String[] args) {
25         System.out.println("输入你想要在斐波那契数列中查找的位置索引:");
26         Scanner s = new Scanner(System.in);
27         int index = s.nextInt();
28         s.close();
29         int res = getValue(index);
30         System.out.println(res);
31     }
32 }

 

posted @ 2021-07-13 13:04  EvanTheBoy  阅读(52)  评论(0)    收藏  举报