題目:古典問題:3個月起每個月都生一對兔子,小兔子長到第三個月後每個月又生一對兔子,假如兔子都不死,問每個月的兔子總數爲多少?
分析:首先我們要明白題目的意思指的是每個月的兔子總對數;假設將兔子分爲小中大三種,兔子從出生後三個月後每個月就會生出一對兔子,
那麼我們假定第一個月的兔子爲小兔子,第二個月爲中兔子,第三個月之後就爲大兔子,那麼第一個月分別有1、0、0,第二個月分別爲0、1、0,
第三個月分別爲1、0、1,第四個月分別爲,1、1、1,第五個月分別爲2、1、2,第六個月分別爲3、2、3,第七個月分別爲5、3、5……
兔子總數分別爲:1、1、2、3、5、8、13……
於是得出了一個規律,從第三個月起,後面的兔子總數都等於前面兩個月的兔子總數之和,即爲斐波那契數列。
public class Test{
public static void main(String[] args){
int i = 1;
for(i=1;i<=20;i++){
System.out.println("兔子第"+i+"個月的總數爲:"+f(i));
}
}
public static int f(int x){
if(x==1 || x==2){
return 1;
}else{
return f(x-1)+f(x-2);
}
}
}
public class Digui {
public int sum(int i){
if(i==1){
return 1;
}
return i+sum(i-1);
}
public static void main(String[] args) {
Digui test=new Digui();
System.out.println("計算結果:"+test.sum(100)+"!");
}
}
從1到100階乘:
需要注意的是計算後的結果數值過大程序無法返回,一般情況會返回0!那麼用int、long 是無法滿足的, 所以要用BigInteger
public class Digui {
public BigInteger sum(int i) {
if (i == 1) {
return BigInteger.ONE;
}
return BigInteger.valueOf(i).multiply(sum(i-1));
}
public static void main(String[] args) {
Digui test = new Digui();
try {
System.out.println("計算結果:" + test.sum(50) + "!");
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
另外提別提醒下真實項目中要慎重使用遞歸算法,大致總結下遞歸算法的優缺點:
優點:
代碼更簡潔清晰,可讀性更好
缺點:
由於遞歸需要系統堆棧,所以空間消耗要比非遞歸代碼要大很多。而且,如果遞歸深度太大,可能系統撐不住。