(c#)数据结构与算法分析 --递归
生活随笔
收集整理的這篇文章主要介紹了
(c#)数据结构与算法分析 --递归
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
遞歸
????不知道有新手聽沒(méi)聽過(guò)別人拿剝糖塊來(lái)形容遞歸,諸如一層層地剝好比一層層地進(jìn)入遞歸。這種比喻可是誤導(dǎo)了我,只想著剝了,其實(shí)剝完皮兒,取出糖塊,再把皮兒一層層地穿上才算個(gè)完整的遞歸。????
??? 遞歸就是自己調(diào)用自己的函數(shù)或方法了,一般情況,像我這樣的新手剛接觸遞歸的時(shí)候,迷就迷在了不明白遞歸的原理上,在 (c#)數(shù)據(jù)結(jié)構(gòu)與算法分析 --棧與隊(duì)列 中說(shuō)過(guò),編譯器一般用棧來(lái)實(shí)現(xiàn)遞歸,具體就看那篇文章吧。
??? 這里先舉一個(gè)用到遞歸的例子。
??? 求第n項(xiàng)的三角數(shù)字,三角數(shù)字就是數(shù)列中,第n項(xiàng)的值是第n-1項(xiàng)加上n得來(lái)的。這里可不是那個(gè)斐波那契數(shù)列。
??? 1,3,6,10,15,21......... 這些個(gè)數(shù)就是三角數(shù)字。
??? 這個(gè)遞歸方法就是計(jì)算第n項(xiàng)的三角數(shù)字:
?1?//使用遞歸求第n項(xiàng)的三角數(shù)
?2?private?int?triangle(int?n)
?3?????????{
?4?????????????if?(n?==?1)?//這是遞歸的基準(zhǔn)情形,一個(gè)遞歸沒(méi)有基準(zhǔn)的話,就沒(méi)法跳出遞歸。
?5?????????????{
?6?????????????????return?n;
?7?????????????}
?8?????????????else
?9?????????????{
10?????????????????return?(n?+?triangle(n?-?1));?//調(diào)用本方法
11?????????????}
12?????????}
很簡(jiǎn)單的一個(gè)算法,可用 第n個(gè)三角數(shù)字=(n*n+n)/2 這個(gè)公式來(lái)驗(yàn)證其正確性。
仔細(xì)看看這個(gè)圖就會(huì)完全明白遞歸到底怎么遞歸了。
n=5時(shí),開始調(diào)用
↓
第1層
↓
返回15
(這個(gè)表格在firefox下顯示有點(diǎn)問(wèn)題)
??? 這時(shí),應(yīng)該把遞歸理順了吧,自己可以試試用遞歸求階乘,然后試著解決漢諾塔問(wèn)題,google搜一下會(huì)有很多漢諾塔問(wèn)題的源碼。
??? 很明顯,上面那個(gè)遞歸是尾遞歸,在某些情況下,比如函數(shù)體比較龐大,有很多局部變量,則很容易引起棧溢出。有時(shí)候應(yīng)該消除遞歸。
???
??? 這就用到棧了,下面這個(gè)源碼,功能和上面一樣,只不過(guò)用棧來(lái)消除遞歸了。
?1?//消除遞歸,使用棧代替遞歸
?2?????????private?int?triangleStack(int?n)
?3?????????{
?4?????????????Stack<int>?traingle?=?new?Stack<int>();?//這個(gè)棧來(lái)模擬遞歸中的環(huán)境變量
?5?
?6?????????????while?(n?>=?1)?//相當(dāng)于遞歸中的基準(zhǔn)了
?7?????????????{
?8?????????????????traingle.Push(n);?//將每次遞減的值壓入棧,相當(dāng)于逐層調(diào)用遞歸
?9?????????????????n?=?n?-?1;
10?????????????}
11?
12?????????????while?(traingle.Count?>?0)?//這個(gè)相當(dāng)于逐層跳出遞歸
13?????????????{
14?????????????????n?=?n?+?traingle.Pop();?//計(jì)算
15?????????????}
16?
17?????????????return?n;
18?????????}
??? 不是很難吧,主要把遞歸的原理理清,思路自然就明了了。
??? 要注意的是,使用遞歸千萬(wàn)可別忘了基準(zhǔn)情形,不然就永遠(yuǎn)遞歸不出來(lái)了。遞歸的效率有時(shí)候比較低,這樣就可以用棧或循環(huán)來(lái)代替遞歸了。
????不知道有新手聽沒(méi)聽過(guò)別人拿剝糖塊來(lái)形容遞歸,諸如一層層地剝好比一層層地進(jìn)入遞歸。這種比喻可是誤導(dǎo)了我,只想著剝了,其實(shí)剝完皮兒,取出糖塊,再把皮兒一層層地穿上才算個(gè)完整的遞歸。????
??? 遞歸就是自己調(diào)用自己的函數(shù)或方法了,一般情況,像我這樣的新手剛接觸遞歸的時(shí)候,迷就迷在了不明白遞歸的原理上,在 (c#)數(shù)據(jù)結(jié)構(gòu)與算法分析 --棧與隊(duì)列 中說(shuō)過(guò),編譯器一般用棧來(lái)實(shí)現(xiàn)遞歸,具體就看那篇文章吧。
??? 這里先舉一個(gè)用到遞歸的例子。
??? 求第n項(xiàng)的三角數(shù)字,三角數(shù)字就是數(shù)列中,第n項(xiàng)的值是第n-1項(xiàng)加上n得來(lái)的。這里可不是那個(gè)斐波那契數(shù)列。
??? 1,3,6,10,15,21......... 這些個(gè)數(shù)就是三角數(shù)字。
??? 這個(gè)遞歸方法就是計(jì)算第n項(xiàng)的三角數(shù)字:
?1?//使用遞歸求第n項(xiàng)的三角數(shù)
?2?private?int?triangle(int?n)
?3?????????{
?4?????????????if?(n?==?1)?//這是遞歸的基準(zhǔn)情形,一個(gè)遞歸沒(méi)有基準(zhǔn)的話,就沒(méi)法跳出遞歸。
?5?????????????{
?6?????????????????return?n;
?7?????????????}
?8?????????????else
?9?????????????{
10?????????????????return?(n?+?triangle(n?-?1));?//調(diào)用本方法
11?????????????}
12?????????}
很簡(jiǎn)單的一個(gè)算法,可用 第n個(gè)三角數(shù)字=(n*n+n)/2 這個(gè)公式來(lái)驗(yàn)證其正確性。
仔細(xì)看看這個(gè)圖就會(huì)完全明白遞歸到底怎么遞歸了。
n=5時(shí),開始調(diào)用
↓
第1層
| n=5 | ||||||||
| 第2層
返回 15 |
返回15
(這個(gè)表格在firefox下顯示有點(diǎn)問(wèn)題)
??? 這時(shí),應(yīng)該把遞歸理順了吧,自己可以試試用遞歸求階乘,然后試著解決漢諾塔問(wèn)題,google搜一下會(huì)有很多漢諾塔問(wèn)題的源碼。
??? 很明顯,上面那個(gè)遞歸是尾遞歸,在某些情況下,比如函數(shù)體比較龐大,有很多局部變量,則很容易引起棧溢出。有時(shí)候應(yīng)該消除遞歸。
???
??? 這就用到棧了,下面這個(gè)源碼,功能和上面一樣,只不過(guò)用棧來(lái)消除遞歸了。
?1?//消除遞歸,使用棧代替遞歸
?2?????????private?int?triangleStack(int?n)
?3?????????{
?4?????????????Stack<int>?traingle?=?new?Stack<int>();?//這個(gè)棧來(lái)模擬遞歸中的環(huán)境變量
?5?
?6?????????????while?(n?>=?1)?//相當(dāng)于遞歸中的基準(zhǔn)了
?7?????????????{
?8?????????????????traingle.Push(n);?//將每次遞減的值壓入棧,相當(dāng)于逐層調(diào)用遞歸
?9?????????????????n?=?n?-?1;
10?????????????}
11?
12?????????????while?(traingle.Count?>?0)?//這個(gè)相當(dāng)于逐層跳出遞歸
13?????????????{
14?????????????????n?=?n?+?traingle.Pop();?//計(jì)算
15?????????????}
16?
17?????????????return?n;
18?????????}
??? 不是很難吧,主要把遞歸的原理理清,思路自然就明了了。
??? 要注意的是,使用遞歸千萬(wàn)可別忘了基準(zhǔn)情形,不然就永遠(yuǎn)遞歸不出來(lái)了。遞歸的效率有時(shí)候比較低,這樣就可以用棧或循環(huán)來(lái)代替遞歸了。
總結(jié)
以上是生活随笔為你收集整理的(c#)数据结构与算法分析 --递归的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 技术社区,你真的会混吗?
- 下一篇: C#WinForm App自动更新(Li