最近刷知乎看到了這個問題,對其中 乙個用了遞迴的回答產生了極大的興趣,所以寫下了這篇隨筆。
這是乙個入門級的問題233.
一般情況下我們可能想到用for迴圈或while語句來解決這個問題。
比如下面的**:
1 #include2while語句**:using
namespace
std;
3int
main()48
for(int i = 100; i >= 1; i --)
11return0;
12 }
1 #include2回到正題,這篇隨筆我們要討論的是遞迴寫法:using
namespace
std;
3int
main()410
while(n >= 1)14
15return0;
16 }
1 #include2我們會發現f函式中if外的cout用的非常巧妙。using
namespace
std;
3void f(intn)4
9 cout << n << "";
10}11int
main()
12
這是執行結果:
而去掉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了。
1列印沙漏
恢復內容開始 本題要求你寫個程式把給定的符號列印成沙漏的形狀。例如給定17個 要求按下列格式列印 所謂 沙漏形狀 是指每行輸出奇數個符號 各行符號中心對齊 相鄰兩行符號數差2 符號數先從大到小順序遞減到1,再從小到大順序遞增 首尾符號數相等。給定任意n個符號,不一定能正好組成乙個沙漏。要求列印出的沙...
自測 1 列印沙漏
本題要求你寫個程式把給定的符號列印成沙漏的形狀。例如給定17個 要求按下列格式列印 所謂 沙漏形狀 是指每行輸出奇數個符號 各行符號中心對齊 相鄰兩行符號數差2 符號數先從大到小順序遞減到1,再從小到大順序遞增 首尾符號數相等。給定任意n個符號,不一定能正好組成乙個沙漏。要求列印出的沙漏能用掉盡可能...
自測 1 列印沙漏
本題要求你寫個程式把給定的符號列印成沙漏的形狀。例如給定17個 要求按下列格式列印 所謂 沙漏形狀 是指每行輸出奇數個符號 各行符號中心對齊 相鄰兩行符號數差2 符號數先從大到小順序遞減到1,再從小到大順序遞增 首尾符號數相等。給定任意n個符號,不一定能正好組成乙個沙漏。要求列印出的沙漏能用掉盡可能...