遞迴。
是的,差不多就是這種感覺。上面就是類似遞迴的顯示表現。
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...