不死神兔陣列方法的分析和遞迴方法的程式碼
阿新 • • 發佈:2021-01-21
不死神兔的一點理解
- 題目是這樣的:有一對兔子,從出生第三個月起每個月都生一對兔子,小兔子長到第三個月後,每個 月又生一隻兔子,假如兔子都不死,問第二十個月的兔子對數為多少。
看到這個問題,我首先想到的是遞迴,因為他符合斐波那契數列,程式碼如下:
public class Rabbit { public int rabbit(int month){ if(month == 2 || month == 1){ return 1; }else{ return rabbit(month - 1) + rabbit(month - 2);//3 } } public static void main(String[] args) { Rabbit r = new Rabbit(); int rabbit = r.rabbit(20); System.out.println(rabbit); } }
接著由於一些原因,我有用陣列做了一下,並分析了一下過程,分析過程如下:
分析:先拋開前三個月份,看第四個月份,你如果想知道第四個月有多少隻兔子,那麼你就需要弄清楚在第三個月的時候原本有多少隻兔子,以及在第四個月有多少兔子要生寶寶,也就是相比於第三個月,第四個月多出來的兔子數量應該是第三個月要生寶寶的兔子數。但是因為剛出生的兔子要經過三個月才能生寶寶,所以說在四月份的時候要生寶寶的兔子數量應該是二月份兔子的數量。然後因為你用陣列已經記錄了每個月的兔子的數量,所以二月份的兔子數量就是arr[1]。
因此能得到這樣的公式:arr[4] = arr[3] + arr[2]
然後按照這個思路繼續往下推即可得到:arr[x] = arr[x - 1] + arr[x - 2]
也就是:當月的兔子數量 = 原本的兔子數量 + 在這個月要出生的兔子數量
(上個月的兔子數量) (上上個月的兔子數量)
程式碼如下:
package com.orchestra.exer; /** * 題目描述:有一對兔子,從出生第三個月起每個月都生一對兔子,小兔子長到第三個月後,每個月又生一隻兔子, * 假如兔子都不死,問第二十個月的兔子對數為多少。 * @author tree * @create 2021-01-20-19:40 */ public class Rabbit2 { public static void main(String[] args) { int[] arr = new int[20]; arr[0] = arr[1] = 1; System.out.println(arr.length); for (int x = 2; x < arr.length; x++) { arr[x] = arr[x - 2] + arr[x - 1]; } System.out.println(arr[19]); } }