溫故而知新 C語言 遞迴

2022-02-18 08:43:59 字數 1965 閱讀 8723

遞迴。

是的,差不多就是這種感覺。上面就是類似遞迴的顯示表現。

2017 10 24更新:

遞迴這個問題放了很久。也沒有寫。大概是自己還沒有好好理解吧。

在這裡寫下自己理解的全部。

一 何為遞迴。

字面意義,分開看。 有傳遞。有回歸。或者歸還。

淺顯的理解就是呼叫自己。

那麼遞迴可以呼叫自己,肯定是有一些約束的條件。 不然就會無限次的呼叫自己。這個很好理解吧?

說乙個小示例來講解一下何為遞迴。

乙個房子裡面有乙個男人在玩著乙個房子模型,房子模型裡面還有乙個房子,房子裡面有乙個男人,男人在玩著乙個房子模型,房子模型裡面有乙個男人,男人在玩著乙個房子模型....

從前有乙個座山,山上有一座廟,廟裡有個老和尚,老和尚再給小和尚講故事,故事是從前有乙個座山,山上有一座廟,廟裡有乙個老和尚,老和尚再給小和尚講故事,故事是從前有一座山...

這就是遞迴了。

ok,講了這麼多,那麼如何寫呢?

其實寫遞迴還好,最重要的是理解遞迴。

例子:

int fu(int

n)

二: 遞迴出口

剛才講遞迴是要約束的,那麼遞迴的約束就是遞迴出口。

遞迴出口是什麼呢?

你想想啊,剛才我舉了兩個例子,房子和老和尚。如果沒有出口是不是就無限遞迴了。 

我們使用遞迴,不是為了無限遞迴了。沒什麼用了啊!

所以要有乙個出口,也就是遞迴的限制。

三 遞迴使用

遞迴的本質和迴圈差不多的。遞迴能幹的事情,迴圈也能幹。

那麼為什麼遞迴還要存在呢,因為短小精悍。

ok,那麼什麼情況下會用到遞迴呢? 你需要寫乙個函式,函式的內容都很單一(就是處理乙個事物),能用迴圈解決的。這些都可以用遞迴來解決。

那麼示例1:

階乘 

int fu(int

n)

嗯,這就是乙個階乘遞迴。

階乘是什麼呢?

1! =1*1

2!=2*1

3!=3*2*1

4!=4*3*2*1

5!=5*4*3*2*1

就是這個數乘上這個數以前所有的數。

那麼如何理解這個階乘演算法呢?

比如說求5的階乘。

5的階乘是不是5*4的階乘

4的階乘是不是4*3的階乘

3的階乘是不是3*2的階乘

2的階乘是不2*1的階乘

1的階乘是不是1

看見沒,求5的階乘你必須先回到到1的階乘,一步一步向上計算才能算到5的階乘。這乙個過程就是遞迴。

遞迴的過程是:遞到1,歸回5.

讓我們看一下流程圖。

上面的圖不太標準,如果有在學習演算法的話,理解一下棧,可以對遞迴的理解有一定的幫助。

四 遞迴的理解。

遞迴呢,很好用,但是呢也有一定的缺陷,比如時間的複雜度啊,很浪費空間啊。

但是在**上確實很簡短。

說起來還是要理解你要處理的事物,對這個事物的演算法有一定要深度理解。

要能推算出能夠遞迴的演算法。 就如比說上面的乘階。 很明顯就能看出來是個遞迴的演算法。

符合遞迴的演算法是什麼?

說實話 我也不是會很多。但是呢 肯定有乙個特點。

可以推算到最底部,或者最開始的部分。

然後呢在沿著向上可以算出最頂部的部分。

我理解的遞迴就是如此了。

溫故而知新

堆排 建立堆,維護堆的屬性 一次拿掉乙個,然後維護屬性,二分的結構 使得維護屬性只要logn的時間 冒泡也是一次拿走乙個 但是線性的結構 每次沒有節省時間 快排 一次確定 乙個值的位置,然後二分,縮小問題的範圍。floyd找最短 一次更新 將狀態改為經過固定點的 最短距離 迴圈 遍歷每個點,則結果為...

C 陣列 溫故而知新

using system using system.collections.generic using system.linq using system.text namespace 陣列 陣列初始化器只能在宣告陣列變數時使用,不能在宣告陣列之後使用 int iii new int 用花括號初始化陣...

C 溫故而知新,好吃

這一周,在業餘的時候,學習和 了c 中的知識點,一木不成林,一水難成海。1.net 是乙個開發平台,它幹著秦始皇的事,統一了程式設計類庫,提供了網路通訊標準可擴充套件標記語言的完全支援。方便你我他,大家使好它。microsoft.net 是microsoft xml web services平台。2...