斐波那契数列

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

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

先上代码:

 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 }

斐波那契数列

 

斐波那契数列

上一篇:docker 的一些常用命令


下一篇:203. 移除链表元素