1. 程式人生 > 資訊 >《DOTA2》TI10 比賽落地羅馬尼亞:該國政府將收取一成獎金,超 400 萬美元

《DOTA2》TI10 比賽落地羅馬尼亞:該國政府將收取一成獎金,超 400 萬美元

本次程式可以獲取斐波那契數列任意位置上的數字。

要怎樣實現呢?用遞迴就可以了。

先上程式碼:

 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 }