1.需求
有一對兔子,從出生後第三個月開始每月生一對兔子,小兔子從第三個月開始每月也生一對兔子,加入是不死神兔,那麼第20個月一共生多少對兔子?
2.分析
第一個月兔子對數: 1
第二個月兔子對數:1
第三個月兔子對數:2
第四個月兔子對數:3
第五個月兔子對數:5
第六個月兔子對數:8
....
斐波那契數列:1,1,2,3,5,8...
第二個月兔子對數:1
第三個月兔子對數:2
第四個月兔子對數:3
第五個月兔子對數:5
第六個月兔子對數:8
....
斐波那契數列:1,1,2,3,5,8...
3.方法實現(三種方法)
- 數組實現
- 相鄰變量規律實現
- 遞規實現
思路:先寫出幾個(大部分都是這樣的思想,第一次、第二次、第三次,然後規律就出來了),然後找規律。
代碼體現
public class RabbitTest {
public static void main(String[] args) {
// 方法1
int[] array = new int[20];
// 從第三個月開始,是前兩個數的和array[2]=array[1]+array[0]
array[0] = 1;// 已知
array[1] = 1;// 已知
for (int x = 2; x < array.length; x++) {
array[x] = array[x - 1] + array[x - 2];
}
System.out.println("第20個月的兔子對數是:" + array[array.length - 1]);
// 方法2(相鄰取值法)
/*
* 假設相鄰的兔子對數是x,y 第一個相鄰數據: x=1,y=1
* 第二個相鄰數據: x=1,y=2 第三個相鄰數據: x=2,y=3
* 第四個相鄰數據: x=3,y=5 第五個相鄰數據: x=5,y=8 .....
* 第x次的x是上一次的y值,第x次的y是上一次的x和y之和
*/
int x = 1;// 已知
int y = 1;// 已知
// 爲什麼18次循環呢?因爲從第二次開始x=1,y=1+1的,少一次,3個數據相鄰的次數只有2次,,所以由少一次,所以18次
for (int i = 0; i < 18; i++) {
int tempx = x;// 上一次的x
int tempy = y;// 上一次的y
x = tempy;
y = tempx + tempy;
}
System.out.println("第20個月的兔子對數是:" + y);
// 方法3
//遞規方法
System.out.println("第20個月的兔子對數是:" + getSum(20));
}
// 遞規實現
// 方法返回值類型int,參數列表int month,出口條件month=1或者month=2,規律前兩個月之和
public static int getSum(int month) {
if (month == 1 || month == 2)
return 1;
else
return getSum(month - 1) + getSum(month - 2);
}
}
4.歸納總結
1.遞規思想
①必須要有方法②要有出口條件,不然就是死遞規③必須有規律
注意:遞規次數不能太多,否則每次調用一次方法就在棧內存加載一次,然後到出口條件依次出棧,次數過多會導致內存溢出。