極限遞迴(思維反轉)

2021-03-31 08:56:31 字數 1453 閱讀 6610

rel=file-list href="./遞迴是程式設計的基礎,而且是很有潛力可挖的設計模式之一.files/filelist.xml">

遞迴是程式設計的基礎,而且是很有潛力可挖的設計模式之一遞迴是程式設計的基礎,而且是很有潛力可挖的設計模式之一。遞迴有兩種模式,一種是基於程式堆疊的內部遞迴,該方法用的最多,在小規模問題上最為方便,對於遞迴層次較深時,往往需要借助於外部的棧,但實現原理時一樣的。

本文將介紹兩個最基礎的遞迴問題,該問題適合初學者,但解決該問題的方法要足夠優雅,所以還是對能夠熟練應用

c++的同仁們有一定參考價值的。

漢諾塔問題

談到遞迴,就不能不談一下漢諾塔,這是個十分著名而且也十分有意思的遞迴問題,要求是利用三個底座來移動一堆圓盤,要求將圓盤從

a底座全部移到

c底座,移動的順序則必須是每次移動均保證每個底座上處於下部的盤子大於處於上部的盤子的面積。

大家可以從譚老師的

c程式設計上得到乙個官方解,但那絕對不是最簡潔和優雅的。下面我給出我的解法,算作拋磚,希望引出大家手裡的玉。

#include

#include

unsigned

long

time=0;

void

hanor(

inti,

char

a,char

b,char

c)

int

main()

八皇后問題

八皇后是另外乙個遞迴經典問題,該問題要求在乙個西洋棋盤上擺放

8個皇后,皇后們均魅力四射,在公尺子型的格仔上不允許其它皇后的存在,該問題較漢諾塔問題複雜一些,解答也較有趣一些。為了得到更加優雅和簡潔的解法,我再冒昧拋一塊磚。

#include

using

namespace

std;

#include

int

queens[9];

bool

is;

int

total=0;

void

run(

intnum)

if(is)

if(num<8)

run(num+1);

}

}

}

int

main()

故意不作注釋了,希望如此短小的**,能夠有人願意閱讀分析。

設計遞迴程式是很有趣和有挑戰性的,如何優雅簡潔,占用記憶體小,效率高,都是需要兼顧的,而且是構建許多實際應用的核心技術,大量的資料結構和演算法,如

btree

可以說是老闆思維,假如你是老闆,你自己做頭一部分,剩下的交給下面的人來做。case1 陣列的求和 private static intsum int arr,int begin return arr begin sum arr,begin 1 case2 翻轉字串 private static st...

遞迴(鍊錶反轉)

將乙個單鏈表反轉,結果得到的是鍊錶的最後乙個,以及第乙個。確實是反轉了,但是只剩下兩個元素了。public static node reversenode node node node newheadnode reversenode node.getnext node.setnext null ne...

遞迴特性,思維要點

遞迴的本質就是函式呼叫自身,每次都會帶著當前層的狀態或引數下探到下一層,進行重複性的步驟,直至遞迴出口,攜帶改變後的狀態結果返回到上一層。def recursion level,parma1,prams2,1.遞迴終止條件 if level max level process result 處理結果...