###### 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
函式名稱相同,但參數的個數和型態不同
白話:用一樣的名稱做到不同的事
(達到相同的結果但中間過程不一樣)