基本算法之遞歸算法

基本算法之遞歸算法

一.遞歸算法的基本思想

遞歸算法即在程序中不斷反覆調用自身來達到求解問題的方法。此處的重點是調用自身,這就要求待解決的問題能夠分解爲相同問題的一個子問題。這樣通過多次調用,就可以完成求解。
遞歸調用是一個方法在其方法體內調用其自身方法的調用方式。這種方法也稱爲遞歸方法。在遞歸方法中,主調方法又是被調方法。執行遞歸方法將反覆調用其自身。每調用一次就進入新的一層。在編寫遞歸方法時,必須使用if語句強制方法在未執行遞歸調用前返回。如果不這樣做,在調用方法後,它將永遠不會返回。這是一個很容易犯的錯誤
方法的遞歸調用分兩種情況:直接遞歸和間接遞歸。
直接遞歸:即在方法中調用方法本身。
間接遞歸:即間接的調用一個方法,如function_a調用function_b,function_b又調用function_a。
對遞歸的優缺點進行一下總結:
**優點:**程序代碼更簡潔清晰,可讀性更好。有的算法用遞歸表示要比用循環表示簡潔精煉,而且與人工智能有關的問題,更適合用遞歸的方法,如八皇后問題,漢諾塔問題等。有的算法用遞歸可以實現,而用循環不一定可以實現。
**缺點:**大部分遞歸例程沒有明顯地減少代碼規模和節省內存空間。遞歸形式比非遞歸形式運行的速度要慢一些。這是因爲附加的方法調用增加了時間的開銷,例如需要執行一系列的壓棧出棧等操作。但在許多情況下不是太明顯,速度的差別不是很大。如果遞歸層次太深,還可能導致堆棧溢出。

二.典型實例

典型問題就是數學上求階乘的問題
1.分析:
所謂階乘,就是從1到指定數之間的所有的自然數相乘的結果,n的階乘爲:n!=n*(n-1) * (n-2) * … * 2 * 1
而對於(n-1)!,則有如下的表達式:
(n-1)!=(n-1) * (n-2) * … * 2 * 1
從上述兩個表達式可以看到階乘具有明顯的遞推性質,即符合如下遞推公式:n!=n*(n-1)!
2.參考代碼

import java.util.Scanner;

public class Factorial {
	public static long fact(int n) {     //求階乘方法
		if(n<=1) {
			return 1;
		}else {
			return n*fact(n-1);        //遞歸
		}
	}

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		int i;
		System.out.println("輸入一個求階乘的整數:");
		Scanner input = new Scanner(System.in);
		i=input.nextInt();
		System.out.println(i+"的階乘結果爲:"+fact(i));   //方法調用
	}

}

3.結果展示
在這裏插入圖片描述

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