當前位置:首頁 » 操作系統 » 遞歸演算法的數據結構

遞歸演算法的數據結構

發布時間: 2022-04-26 02:10:33

『壹』 在計算機內實現遞歸演算法時所需的輔助數據結構是

這么想 一個函數遞歸調用自己 第一次調用叫M1 第二次M2 ……最後次叫Mn 調用的時候是M1->M2->M3……->Mn 但是執行是反過來的 Mn執行結束後 返回結果是作為Mn-1的一部分的 Mn-1執行完 返回給Mn-2 一層層遞歸上去至M1執行結束 這個遞歸才結束 這是什麼 後進先出 !懂了么

『貳』 遞歸演算法使用的數據結構是棧嗎

a

這里的棧即是指堆棧,是一種先進後出的數據結構。系統實現遞歸時,本身也是用堆棧實現的,用來保存現場信息。

『叄』 C語言遞歸問題,數據結構基礎

數組下標從0到i-1,共i個數,當然是乘以i了。注意下標從0開始,而不是從1開始。

『肆』 實現遞歸演算法所需的數據結構是什麼

堆棧,為了保存函數入口和上下文。

『伍』 數據結構是一種遞歸演算法嗎

數據結構就是數據結構;

遞歸演算法是演算法的一種。

兩者不能說風馬牛不相及。但相提並論似乎不妥!

『陸』 寫一個遞歸演算法(數據結構)

簡單,實現用結構數組,三個成員域, 變數名,表達式, 默認值,當然這個檢索比較麻煩,我不能用變數名"A"直接找到,對應的其他值(必須要循環數組),用C#的的字典對象就好辦了<index,value>,這個不是關鍵
下面 寫個函數 叫 defaulvalue cal( 變數名) {
if 變數名.默認值<> null 則 cal (計算公式); -- 遞歸開始,計算公式要進行解析,按單獨變數來,還要解析運算符(有點復雜,如果涉及到運算符的優先判斷,這里的都是平級的,還有進行運算符優先判斷)
else reture 默認值 --遞歸終結
}
基本就這樣,有點簡單,還要仔細斟酌下

『柒』 在遞歸演算法執行過程中,計算機系統必定會用到的數據結構是

指針

因為遞歸調用必然會用到函數指針對同一函數體進行反復的調用。

『捌』 數據結構中的遞歸演算法問題

全排列問題是沒辦法優化的!
你生成了全排列總得輸出(存儲)吧?這至少要1個單位時間吧?而n個數的全排列有n!個吧?那至少要n!的時間吧?
恰恰你遞歸+for的次數也是n!次。所以最多也只是在時間上乘以2而已。何況存儲用的時間遠高於運算用的時間。輸出就更費時了。

『玖』 C語言遞歸演算法

本人學c++,c的語法已經淡忘了,但是遞歸不管什麼語言都是一個原理
其實簡單一點來說就像數學裡面的數列的通項公式:
例如一個數列是2,4,6,8,10......
很容易就可以得到通項公式是a[n]=2*n n是大於0的整數
你肯定學過這個數列的另外一種表示方式就是: a[1]=2, a[n]=a[n-1]+2 n是大於1的整數
其實這就是一個遞歸的形式,只要你知道初始項的值,未知項和前幾項之間的關系就可以知道整個數列。
程序例子:比如你要得到第x項的值
普通循環:
for(int i=1; i<=n; i++)
if (i == x)
cout << 2*i; /*cout 相當於 c裡面的printf,就是輸出.*/
遞歸:
int a(int x) {
if (x = 1)
return 2; /* 第一項那肯定是2了,這個也是遞歸的終止條件! */
else return a(x-1)+2; /* 函數自身調用自身是遞歸的一個特色 */
比如x=4,那麼用數學表示就是a(4)=a(3)+2=(a(2)+2)+2=((a(1)+2)+2)+2
其實遞歸方法最接近自然,也是最好思考的一個方法,難點就是把對象建模成遞歸形式,但是好多問題本身就是以遞歸形式出現的。
普通遞歸就是數據結構上的堆棧,先進後出。
例如上面x=4,把a(4)放入棧底,然後放入a(3),然後a(2),a(1),a(1)的值已知,出棧,a(1)=2,a(2)出棧a(2)=a(1)+2=2+2=4,a(3)出棧a(3)=a(2)+2=(a(1)+2)+2=6,a(4)出棧a(4)=a(3)+2=(a(2)+2)+2=((a(1)+2)+2)+2=8
再比如樓上的階乘例子,當n=0 或 1時,0!=1,1!=1,這個是階乘的初始值,也是遞歸的終止條件。然後我們知道n!=n*(n-1)!,當n>1時,這樣我們又有了遞歸形式,又可以以遞歸演算法設計程序了。(樓上已給出譚老的程序,我就不寫了)。
我給出一種優化的遞歸演算法---尾遞歸。
從我給出的第一演算法可以看出,先進棧再出棧,遞歸的效率是很低的。速度上完全比不上迭代(循環)。但是尾遞歸引入了一個新的函數參數,用這個新的函數參數來記錄中間值.
普通遞歸階乘fac(x),就1個x而已,尾遞歸用2個參數fac(x,y),y存放階乘值。
所以譚老的程序就變成
// zysable's tail recursive algorithm of factorial.
int fac(int x, int y) {
if (x == 1)
return y;
else return fac(x-1, y*x);}
int ff(int x) {
if (x == 0)
return 1;
else return fac(x,1);}
對於這個程序我們先看函數ff,函數ff其實是對fac的一個封裝函數,純粹是為了輸入方便設計的,通過調用ff(x)來調用fac(x,1),這里常數1就是當x=1的時候階乘值了,我通過走一遍當x=3時的值即為3!來說明一下。
首先ff(3),x!=0,執行fac(3,1).第一次調用fac,x=3,y=1,x!=1,調用fac(x-1,y*x),新的x=2,y=3*1=3,這里可以看到,y已經累計了一次階乘值了,然後x還是!=1,繼續第三次調用fac(x-1,y*x),新的x=1,y=2*3=6,然後x=1了,返回y的值是6,也就是3!.你會發現這個遞歸更類似於迭代了。事實上我們用了y記錄了普通遞歸時候,出棧的乘積,所以減少了出棧後的步驟,而且現在世界上很多程序員都在倡議用尾遞歸取消循環,因為有些在很多解釋器上尾遞歸比迭代稍微效率一點.
基本所有普通遞歸的問題都可以用尾遞歸來解決。
一個問題以遞歸來解決重要的是你能抽象出問題的遞歸公式,只要遞歸公式有了,你就可以放心大膽的在程序中使用,另外一個重點就是遞歸的終止條件;
其實這個終止條件也是包含在遞歸公式裡面的,就是初始值的定義。英文叫define initial value. 用普通遞歸的時候不要刻意讓自己去人工追蹤程序,查看運行過程,有些時候你會發現你越看越不明白,只要遞歸公式轉化成程序語言正確了,結果必然是正確的。學遞歸的初學者總是想用追蹤程序運行來讓自己來了解遞歸,結果越弄越糊塗。
如果想很清楚的了解遞歸,有種計算機語言叫scheme,完全遞歸的語言,因為沒有循環語句和賦值語句。但是國內人知道的很少,大部分知道是的lisp。
好了,就給你說到這里了,希望你能學好遞歸。

PS:遞歸不要濫用,否則程序極其無效率,要用也用尾遞歸。by 一名在美國的中國程序員zysable。

『拾』 在數據結構的演算法中,1什麼是遞歸,2如何設計遞歸演算法

一個過程或函數在其定義或說明中有直接或間接調用自身的一種方法,它通常把一個大型復雜的問題層層轉化為一個與原問題相似的規模較小的問題來求解,遞歸策略只需少量的程序就可描述出解題過程所需要的多次重復計算,大大地減少了程序的代碼量。給你一個示例做1+2+3+。。。+n
int digui(int n)
{ int t;
if(n>1)
{t=digui(n-1)+n;
return t;}
else
return 1;
}

熱點內容
什麼配置的車最保平安 發布:2024-10-03 17:05:40 瀏覽:854
成人用品數據包上傳 發布:2024-10-03 17:05:30 瀏覽:838
sql資料庫習題 發布:2024-10-03 17:05:29 瀏覽:577
安卓音游哪個好玩 發布:2024-10-03 17:04:14 瀏覽:43
有伺服器的內網如何組建 發布:2024-10-03 16:57:42 瀏覽:358
phplinux安裝目錄 發布:2024-10-03 16:48:57 瀏覽:638
etf怎麼配置資產 發布:2024-10-03 16:42:07 瀏覽:440
紅米忘記鎖屏密碼怎麼辦 發布:2024-10-03 16:41:59 瀏覽:26
chm文件如何編譯 發布:2024-10-03 16:30:22 瀏覽:89
分期到期解壓 發布:2024-10-03 16:27:10 瀏覽:734