Java遞歸算法經典實例(兔子問題、階乘、1到100累加)

題目:古典問題: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();
		}
	}
}


另外提別提醒下真實項目中要慎重使用遞歸算法,大致總結下遞歸算法的優缺點:

優點:

代碼更簡潔清晰,可讀性更好

缺點:

由於遞歸需要系統堆棧,所以空間消耗要比非遞歸代碼要大很多。而且,如果遞歸深度太大,可能系統撐不住。



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章