一、含義
遞歸算法是一種直接或間接地調用自身的算法。在計算機編寫程序中,遞歸算法對解決一大類問題是十分有效的,它往往使算法的描述簡潔而且易於理解。
二、例子
99乘法表的例子
1:普通實現99乘法表太簡單,是個程序員都會,實現如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
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:用遞歸方式實現 99乘法表
代碼如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
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();
}
}
}
|
遞歸的方式調用圖示:
每一個方法的調用都會產生一個棧幀,壓入到方法棧,當遞歸調用的時候,方法棧中棧幀的圖示和上圖類似。
去掉方法中棧幀的引用關系更加直觀:如下圖所示:
簡化掉相應的方法調用最后執行情況如上圖所示,注意 i 一直在變 j每次都是從1開始 然后遞增到和i相等。
這樣上圖依次出棧后就得到了 99 乘法表:
總結:
嵌套for循環 和 用遞歸實現 的比較:
棧 主要是用來存放棧幀的,每執行一個方法就會出現壓棧操作,所以采用遞歸的時候產生的棧幀比較多,遞歸就會影響到內存,非常消耗內存,而使用for循環就執行了一個方法,壓入棧幀一次,只存在一個棧幀,所以比較節省內存。