題目:古典問題: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);
}
}
}
從1到100相加:
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();
}
}
}
另外提別提醒下真實項目中要慎重使用遞歸算法,大致總結下遞歸算法的優缺點:
優點:
代碼更簡潔清晰,可讀性更好
缺點:
由於遞歸需要系統堆棧,所以空間消耗要比非遞歸代碼要大很多。而且,如果遞歸深度太大,可能系統撐不住。