###### tags: `Java 學習筆記` # Java 學習筆記 - 6-1: 進階函式應用: 遞迴 & 函式的多載 ## 遞迴 ```java= public static viod test() { } ``` * 函式自己呼叫自己 * 如使用遞迴,通常程式效能會較差 * 一定要設終止條件不然會無限執行 ## 遞迴應用: 費式數列 費式數列公式: F(0) = 0, n = 0 F(1) = 1, n = 1 F(n) = F(n-1) +F(n-2), n >= 2 ```java= public static int f(int n) { if (n == 0 || n == 1) { return n; } return f(n - 1) + f (n - 2); } ``` 迴圈版本 ```java= int a = 0; int b = 1; int n = 9; for (int i = 2; i <= n; i++) { int tmp = b; // 交換 b = a + b; a = tmp; } System.out.println(b); // 印出f(n) ``` 加入陣列版本 ```java= ``` ## 遞迴應用: 河內塔 ```java= public static void hanoi(int n, char a, char b, char c) { if (n == 1) { System.out.println(a + "->" + c); return; } hanoi(n-1, a, c, b); System.out.println(a + "->" + c); hanoi(n-1, b, a, c); } ``` ## 函式的多載: Signature 函式的署名(Signature)包含三項元素: 1. 函式名稱 1. 參數資料型態 1. 參數的個數與順序 以上也可以說是函式的命名範圍 ```java= public static "參數回傳資料類型" "參數名稱"("參數資料型態", "參數的各式與順序") ``` ```java= public static void swap(int[][] arr, int i1, int i2) ``` #### 最常見的例子就是 print 函式名稱相同,但參數的個數和型態不同 白話:用一樣的名稱做到不同的事 (達到相同的結果但中間過程不一樣)