遞迴演算法案例_PHP教程

來源:互聯網
上載者:User
一.例子(用從C++描述):

行號 程式

0 p (int w)

1 {if( w>o)

2 { cout<

3 p(w-1);

4 p(w-1);

5 }

6 }

結束

執行語句 p(4) 後的列印結果:4 3 2 1 1 2 1 1 3 2 1 1 2 1 1

二.說明:

1.遞迴調用與普通的調用原理相同,只不過是每次調用的函數都是自己本身。

2.我們完全可以自己編程設定堆棧(使用者堆棧),來實現與“遞迴調用”相同的功能。

3. 3.在“遞迴調用”時,系統會自動化佈建和管理堆棧(系統堆棧),而

無需我們的幹預,但這同時增加了“遞迴調用”的神秘性。為了更好

地 地理解“遞迴調用”,現將系統堆棧以表格的方式表示出來。

4.對於“堆棧”格式的一些說明

堆棧的格式為:

方格a
方格b
方格c

函數調用完返回的行號
調用的函數
W 的值

每調用一次函數就“入棧”一次;函數執行完了,就“出棧”一次

三.程式解釋:

1.開始調用p(4),此時執行的語句有:1、2、3

結束
P(4)
4

執行p(4)的語句2:cout<

但是由於語句3,在執行過程中還要調用p(3),只有p(3)執行完了,才能繼續執行p(4)。

2.開始調用P(3),此時執行的語句有:1、2、3

4
P(3)
3

結束
P(4)
4

當p(3)執行完了,就會執行p(4)中的語句4(所以在方格a中,填“4”)。

執行p(3)的語句2:cout<

同上面的情況相同,當執行到語句3,還要調用p(2),只有p(2)執行完了,才能繼續執行p(3)。

3.開始調用P(2),此時執行的語句有:1、2、3

4
P(2)
2

4
P(3)
3

結束
P(4)
4

執行p(2)的語句2:cout<

同上面的情況相同,當執行到語句3,還要調用p(1),只有p(1)執行完了,才能繼續執行p(2)。

4.開始調用P(1),此時執行的語句有:1、2、3

4
P(1)
1

4
P(2)
2

4
P(3)
3

結束
P(4)
4

執行p(2)的語句2:cout<

同上面的情況相同,當執行到語句3,還要調用p(0),只有p(0)執行完了,才能繼續執行p(1)。

5.開始調用P(0),此時執行的語句有:1

4
P(0)
0

4
P(1)
1

4
P(2)
2

4
P(3)
3

結束
P(4)
4

因為w=0不滿足語句1,所以直接跳到語句5、6,從而p(0)執行完畢,p(0)要進行“出棧”操作。

6.此時執行的語句有:4

4
P(1)
1

4
P(2)
2

4
P(3)
3

結束
P(4)
4

由於p(0)執行完成,且p(0)的方格a中為4,因此繼續執行p(1)的語句4 :p(w-1); 又由於p(1)方格c中w值為1,所以調用p(0)。

7.開始調用p(0)

5
P(0)
0

4
P(1)
1

4
P(2)
2

4
P(3)
3

結束
P(4)
4

當p(0)執行完了,就會執行p(1)中的語句5(所以在方格a中,填“5”)。

因為w=0不滿足語句1,所以直接跳到語句5、6,從而p(0)執行完畢,p(0)要進行“出棧”操作。

8.此時執行的語句有:5

4
P(1)
1

4
P(2)
2

4
P(3)
3

結束
P(4)
4

由於p(0)執行完成,且p(0)的方格a中為5,因此繼續執行p(1)的語句5 (最後一句),所以p(1)執行完畢,p(1)要進行“出棧”操作。

9.

4
P(2)
2

4
P(3)
3

結束
P(4)
4

由於p(1)執行完成,且p(1)的方格a中為4,因此繼續執行p(2)的語句4 :p(w-1); 又由於p(2)方格c中w值為2,所以調用p(1)。

10.開始調用P(1),此時執行的語句有:1、2、3

5
P(1)
1

4
P(2)
2

4
P(3)
3

結束
P(4)
4

當p(1)執行完了,就會執行p(2)中的語句5(所以在方格a中,填“5”)。

執行p(1)的語句2:cout<

當執行到語句3,還要調用p(0),只有p(0)執行完了,才能繼續執行p(1)。

11.始調用P(0),此時執行的語句有:1

4
P(0)
0

5
P(1)
1

4
P(2)
2

4
P(3)
3

結束
P(4)
4

因為w=0不滿足語句1,所以直接跳到語句5、6,從而p(0)執行完畢,p(0)要進行“出棧”操作。

12.此時執行的語句有:4

5
P(1)
1

4
P(2)
2

4
P(3)
3

結束
P(4)
4

由於p(0)執行完成,且p(0)的方格a中為4,因此繼續執行p(1)的語句4 :p(w-1);又由於p(1)方格c中w值為1,所以調用p(0)。

13.開始調用p(0)

5
P(0)
0

5
P(1)
1

4
P(2)
2

4
P(3)
3

結束
P(4)
4

當p(0)執行完了,就會執行p(1)中的語句5(所以在方格a中,填“5”)。

因為w=0不滿足語句1,所以直接跳到語句5、6,從而p(0)執行完畢,p(0)要進行“出棧”操作。

14.此時執行的語句有:5

5
P(1)
1

4
P(2)
2

4
P(3)
3

結束
P(4)
4

由於p(0)執行完成,且p(0)的方格a中為5,因此繼續執行p(1)的語句5 (最後一句),所以p(1)執行完畢,p(1)要進行“出棧”操作。

15.

4
P(2)
2

4
P(3)
3

結束
P(4)
4

由於p(1)執行完成,且p(1)的方格a中為5,因此繼續執行p(2)的語句5 (最後一句),所以p(2)執行完畢,p(2)要進行“出棧”操作。

注意:其實步驟10~15重複了步驟4~9,因為它們都調用的P(1)

16.

4
P(3)
3

結束
P(4)
4

由於p(2)執行完成,且p(2)的方格a中為4,因此繼續執行p(3)的語句4 :p(w-1); 又由於p(3)方格c中w值為3,所以調用p(2)。

17.開始調用P(2),此時執行的語句有:1、2、3

5
P(2)
2

4
P(3)
3

結束
P(4)
4

當p(2)執行完了,就會執行p(3)中的語句5(所以在方格a中,填“5”)。

執行p(2)的語句2:cout<

同上面的情況相同,當執行到語句3,還要調用p(1),只有p(1)執行完了,才能繼續執行p(2)。

18.開始調用p(1)

省略……

注意:其實步驟17~29重複了3~15,因為它們都調用的P(2)

在這步驟中,又列印了2 1 1(見步驟3、4、10)

四.結論與分析:

步驟
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

結果
4
3
2
1
1
2
1
1
3
2
1
1
2
1
1

第5個結果重複第4個結果,這是因為他們都調用了p(1)

第6、7、8個結果重複第3、4、5個結果,這是因為他們都調用了p(2)

第9~15個結果重複第2~8個結果,這是因為他們都調用了p(3)

http://www.bkjia.com/PHPjc/477490.htmlwww.bkjia.comtruehttp://www.bkjia.com/PHPjc/477490.htmlTechArticle一.例子(用從C++描述): 行號 程式 0 p (int w) 1 {if( wo) 2 { coutw; 3 p(w-1); 4 p(w-1); 5 } 6 } 結束 執行語句 p(4) 後的列印結果:4 3 2 1 1 2 1...

  • 聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.