/*兔子繁殖問題。 設有一對新生的兔子,從第三個月開始他們每個月都生一對兔子,新生的兔子從第三個月開始又每個月生一對兔子。 按此規律,並假定兔子沒有死亡,20個月后共有多少個兔子?要求編寫為控制台程序。*/ /*解題思路 斐波那契數列問題 f(1) = 1(第1個月有一對兔子) f(2) = 1(第2個月還是一對兔子) f(3) = 2(原來有一對兔子,第3個開始,每個月生一對兔子) f(4) = 3(原來有兩對兔子,有一對可以生育) f(5) = 5(原來有3對兔子,第3個月出生的那對兔子也可以生育了,那么現在有兩對兔子可以生育) f(6) = 8(原來有5對兔子,第4個月出生的那對兔子也可以生育了,那么現在有3對兔子可以生育) .............. 由以上可以看出,第n個月兔子的對數為 f(n) = f(n - 1) + f(n - 2); f(n-1)是上個月的兔子數量,是原來有的。 f(n-2)是可以生育的兔子數,即多出來的數量。第n-2個月開始后的第3個月是第n個月,此時第n-2個月時的兔子都可以生育了。 程序如下:*/ import java.util.*; public class 兔子繁殖問題 { // 方法一:采用斐波那契數遞歸思想 public static int f(int n) { if (n == 1 || n == 2) return 1; else return f(n - 1) + f(n - 2); } // 方法二:為了再提高執行效率,可以采用打表思想 public static int f[]=new int[1000]; public static int f2(int n) { for (int i = 1; i < n; i++) f[i] = i > 2 ? f[i - 2] + f[i - 1] : 1; return f[n] = n > 2 ? f[n - 2] + f[n - 1] : 1; } // 方法三:為了節省空內存間,可采用迭代思想 static int f3(int n) { int a, b, sum; a = b = sum = 1; if (n == 1 || n == 2) return 1; else { for (int i = 3; i <= n; i++) { sum = a + b; a = b; b = sum; } return sum; } } // 方法四:這是藍橋杯一填空題,模擬母牛生產過程,效率低的可怕,想吐槽一下 private int age; public 兔子繁殖問題 afterYear() { age++; return age > 2 ? new 兔子繁殖問題() : null; } public static void f4(int n) { List<兔子繁殖問題> list = new ArrayList<兔子繁殖問題>(); list.add(new 兔子繁殖問題()); for (int i = 0; i < n; i++) { int cowCount = list.size(); for (int j = 0; j < cowCount; j++) { 兔子繁殖問題 rabbit = list.get(j).afterYear(); if (rabbit != null) { list.get(j).afterYear(); list.add(rabbit); } } } System.out.println("第" + n + "個月有兔子" + list.size() + "只"); } public static void main(String[] args) { long start = System.currentTimeMillis(); for (int i = 1; i < 30; i++) { // System.out.println("第" + i + "個月有兔子" + f(i) + "只"); System.out.println("第" + i + "個月有兔子" + f2(i) + "只"); // System.out.println("第" + i + "個月有兔子" + f3(i) + "只"); // f4(i); } double end = System.currentTimeMillis(); double sumTime = (end - start) / 1000.0; System.out.println("執行時間為:" + sumTime + "秒"); } }
運行結果 方法一: 第1個月有兔子1只 第2個月有兔子1只 第3個月有兔子2只 第4個月有兔子3只 第5個月有兔子5只 第6個月有兔子8只 第7個月有兔子13只 第8個月有兔子21只 第9個月有兔子34只 第10個月有兔子55只 第11個月有兔子89只 第12個月有兔子144只 第13個月有兔子233只 第14個月有兔子377只 第15個月有兔子610只 第16個月有兔子987只 第17個月有兔子1597只 第18個月有兔子2584只 第19個月有兔子4181只 第20個月有兔子6765只 第21個月有兔子10946只 第22個月有兔子17711只 第23個月有兔子28657只 第24個月有兔子46368只 第25個月有兔子75025只 第26個月有兔子121393只 第27個月有兔子196418只 第28個月有兔子317811只 第29個月有兔子514229只 執行時間為:0.009秒
方法二 第1個月有兔子1只 第2個月有兔子1只 第3個月有兔子2只 第4個月有兔子3只 第5個月有兔子5只 第6個月有兔子8只 第7個月有兔子13只 第8個月有兔子21只 第9個月有兔子34只 第10個月有兔子55只 第11個月有兔子89只 第12個月有兔子144只 第13個月有兔子233只 第14個月有兔子377只 第15個月有兔子610只 第16個月有兔子987只 第17個月有兔子1597只 第18個月有兔子2584只 第19個月有兔子4181只 第20個月有兔子6765只 第21個月有兔子10946只 第22個月有兔子17711只 第23個月有兔子28657只 第24個月有兔子46368只 第25個月有兔子75025只 第26個月有兔子121393只 第27個月有兔子196418只 第28個月有兔子317811只 第29個月有兔子514229只 執行時間為:0.002秒
方法三: 第1個月有兔子1只 第2個月有兔子1只 第3個月有兔子2只 第4個月有兔子3只 第5個月有兔子5只 第6個月有兔子8只 第7個月有兔子13只 第8個月有兔子21只 第9個月有兔子34只 第10個月有兔子55只 第11個月有兔子89只 第12個月有兔子144只 第13個月有兔子233只 第14個月有兔子377只 第15個月有兔子610只 第16個月有兔子987只 第17個月有兔子1597只 第18個月有兔子2584只 第19個月有兔子4181只 第20個月有兔子6765只 第21個月有兔子10946只 第22個月有兔子17711只 第23個月有兔子28657只 第24個月有兔子46368只 第25個月有兔子75025只 第26個月有兔子121393只 第27個月有兔子196418只 第28個月有兔子317811只 第29個月有兔子514229只 執行時間為:0.002秒
方法四: 第1個月有兔子1只 第2個月有兔子1只 第3個月有兔子2只 第4個月有兔子3只 第5個月有兔子5只 第6個月有兔子8只 第7個月有兔子13只 第8個月有兔子21只 第9個月有兔子34只 第10個月有兔子55只 第11個月有兔子89只 第12個月有兔子144只 第13個月有兔子233只 第14個月有兔子377只 第15個月有兔子610只 第16個月有兔子987只 第17個月有兔子1597只 第18個月有兔子2584只 第19個月有兔子4181只 第20個月有兔子6765只 第21個月有兔子10946只 第22個月有兔子17711只 第23個月有兔子28657只 第24個月有兔子46368只 第25個月有兔子75025只 第26個月有兔子121393只 第27個月有兔子196418只 第28個月有兔子317811只 第29個月有兔子514229只 執行時間為:0.157秒