1. 程式人生 > 實用技巧 >從1列印到100再從100列印到1的遞迴方法

從1列印到100再從100列印到1的遞迴方法

最近刷知乎看到了這個問題,對其中一個用了遞迴的回答產生了極大的興趣,所以寫下了這篇隨筆。

這是一個入門級的問題233.

一般情況下我們可能想到用for迴圈或while語句來解決這個問題。

比如下面的程式碼:

 1 #include<iostream>
 2 using namespace std;
 3 int main()
 4 {
 5     for(int i = 1; i <= 100; i ++){
 6         cout << i << " ";
 7     }
 8     for(int i = 100; i >= 1; i --){
9 cout << i << " "; 10 } 11 return 0; 12 }

while語句程式碼:

 1 #include<iostream>
 2 using namespace std;
 3 int main()
 4 {
 5     int n = 1;
 6     while(n <= 100){
 7         cout << n << " ";
 8         n ++;
 9     }
10     while(n >= 1){
11         cout << n << "
"; 12 n --; 13 } 14 15 return 0; 16 }

回到正題,這篇隨筆我們要討論的是遞迴寫法:

 1 #include<iostream>
 2 using namespace std;
 3 void f(int n)
 4 {
 5     if(n < 100){
 6         cout << n << " ";
 7         f(n + 1);
 8     }
 9     cout << n << " ";
10 }
11 int main()
12 { 13 f(1); 14 return 0; 15 }

我們會發現f函式中if外的cout用的非常巧妙。

這是執行結果:

而去掉if外的cout後,輸出卻變成了這樣:

我們發現不但100到1沒有了,連100都沒了!

我們來深究一下其中的原理233:

當函式f傳入n = 1後,因為n <100所以開始執行if內的語句,先輸出n再執行f(n +1),當n被加到100時,開始不滿足if,則執行if外的cout,所以我們可以看到if外的cout去掉後沒有輸出100,。每個f(n)在最後都會輸出n,所以我們可以看到又遞歸回1了。