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

2022-07-02 02:57:09 字數 1077 閱讀 5354

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

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

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

比如下面的**:

1 #include2

using

namespace

std;

3int

main()48

for(int i = 100; i >= 1; i --)

11return0;

12 }

while語句**:

1 #include2

using

namespace

std;

3int

main()410

while(n >= 1)14

15return0;

16 }

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

1 #include2

using

namespace

std;

3void f(intn)4

9 cout << n << "";

10}11int

main()

12

我們會發現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了。

1列印沙漏

恢復內容開始 本題要求你寫個程式把給定的符號列印成沙漏的形狀。例如給定17個 要求按下列格式列印 所謂 沙漏形狀 是指每行輸出奇數個符號 各行符號中心對齊 相鄰兩行符號數差2 符號數先從大到小順序遞減到1,再從小到大順序遞增 首尾符號數相等。給定任意n個符號,不一定能正好組成乙個沙漏。要求列印出的沙...

自測 1 列印沙漏

本題要求你寫個程式把給定的符號列印成沙漏的形狀。例如給定17個 要求按下列格式列印 所謂 沙漏形狀 是指每行輸出奇數個符號 各行符號中心對齊 相鄰兩行符號數差2 符號數先從大到小順序遞減到1,再從小到大順序遞增 首尾符號數相等。給定任意n個符號,不一定能正好組成乙個沙漏。要求列印出的沙漏能用掉盡可能...

自測 1 列印沙漏

本題要求你寫個程式把給定的符號列印成沙漏的形狀。例如給定17個 要求按下列格式列印 所謂 沙漏形狀 是指每行輸出奇數個符號 各行符號中心對齊 相鄰兩行符號數差2 符號數先從大到小順序遞減到1,再從小到大順序遞增 首尾符號數相等。給定任意n個符號,不一定能正好組成乙個沙漏。要求列印出的沙漏能用掉盡可能...