一、含義
遞歸算法是一種直接或間接地調(diào)用自身的算法。在計算機編寫程序中,遞歸算法對解決一大類問題是十分有效的,它往往使算法的描述簡潔而且易于理解。
二、例子
99乘法表的例子
1:普通實現(xiàn)99乘法表太簡單,是個程序員都會,實現(xiàn)如下:
123456789101112131415 | package test.ms; public class Test99 {
public static void main(String[] args) {
for ( int i= 1 ; i<= 9 ;i++){
for ( int j= 1 ; j<=i; j++){
System.out.PRint(j+ " * " +i+ " = " +(i*j) + " " );
}
System.out.println();
} }
} |
2:用遞歸方式實現(xiàn) 99乘法表代碼如下:
1234567891011121314151617181920212223 | package test.ms; public class MultiTable {
public static void main(String args[]) {
m( 9 );
}
/**
* 打印出九九乘法表
* @param i
*/
public static void m( int i) {
if (i == 1 ) {
System.out.println( "1*1=1 " );
} else {
m(i - 1 );
for ( int j = 1 ; j <= i; j++) {
System.out.print(j + "*" + i + "=" + j * i + " " );
}
System.out.println();
}
} } |
遞歸的方式調(diào)用圖示:
每一個方法的調(diào)用都會產(chǎn)生一個棧幀,壓入到方法棧,當(dāng)遞歸調(diào)用的時候,方法棧中棧幀的圖示和上圖類似。去掉方法中棧幀的引用關(guān)系更加直觀:如下圖所示:
簡化掉相應(yīng)的方法調(diào)用最后執(zhí)行情況如上圖所示,注意 i 一直在變 j每次都是從1開始 然后遞增到和i相等。這樣上圖依次出棧后就得到了 99 乘法表:
總結(jié):
嵌套for循環(huán) 和 用遞歸實現(xiàn) 的比較:
棧 主要是用來存放棧幀的,每執(zhí)行一個方法就會出現(xiàn)壓棧操作,所以采用遞歸的時候產(chǎn)生的棧幀比較多,遞歸就會影響到內(nèi)存,非常消耗內(nèi)存,而使用for循環(huán)就執(zhí)行了一個方法,壓入棧幀一次,只存在一個棧幀,所以比較節(jié)省內(nèi)存。
|
新聞熱點
疑難解答