從1列印到100再從100列印到1的遞迴方法
阿新 • • 發佈:2020-09-19
最近刷知乎看到了這個問題,對其中一個用了遞迴的回答產生了極大的興趣,所以寫下了這篇隨筆。
這是一個入門級的問題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了。