《DOTA2》TI10 比賽落地羅馬尼亞:該國政府將收取一成獎金,超 400 萬美元
阿新 • • 發佈:2021-07-13
本次程式可以獲取斐波那契數列任意位置上的數字。
要怎樣實現呢?用遞迴就可以了。
先上程式碼:
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{ 12int 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 = newScanner(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 }