一.在演算法設計中經常用到遞迴,我們先看看在什麼時候通常適合遞迴。
1.有許多數學公式、數列等等的定義是遞迴,比如階乘、斐波那契數列都是可以將其遞迴定義轉化為對應的遞迴演算法.比如求n!遞迴演算法如下:
long jie_cheng(int n)
typedef struct node;
3.問題的求解方法是遞迴的
比較典型的例子就是漢諾塔問題.這個在前面已經談過就不多做闡述了,原始碼如下:
//遞迴模型如下
hannota(n - 1, x, z, y);
hannota(n, x, y, z) = hannota(n, x, z); //將第n個圓盤從x塔移到z塔
hannota(n - 1, y, x, z); //繼續上述兩個過程
void hannota(int n, char x, char y, char z)
}
二.遞迴模型
我們上述所講的遞迴過程基本上都是有類似3中所寫的遞迴模型的,遞迴模型是遞迴演算法的抽象表示,它反映了乙個遞迴問題的遞迴結構,比如1,其遞迴結構為:
f(n) == 1 n == 1
f(n) = n * f(n - 1) n > 1
三.遞迴設計步驟
1.正如我們之前講到的,遞迴本身是一種分而治之的演算法,它現將整個問題劃分為若干個子問題,再分別求解子問題,最後得到整個問題的解,這是乙個量變到質變的過程.
2.步驟一般為:通過計算求得遞迴模型(一定要包含遞迴出口),再根據這個遞迴模型編寫演算法.
//說了那麼多,我們結合線性表舉個例項,來練習一下.
問題:假設有一不帶頭結點的l,設計演算法釋放所有節點
//分析:如果我們先釋放在遞迴,那麼後序節點就斷開了,因此必須先釋放尾節點
1.遞迴模型
什麼都不做 if(l == null)
myfree(l->next) if(l != null)
//假設節點為 linklist(這是乙個一級指標)
void myfree(linklist l)
}
//如果有興趣大家可以用遞迴求節點個數、正向、反向輸出節點、刪除值為x的節點dengdeng.
//--.--謝謝各位大佬捧場
//a step is for many steps.
遞迴與線性表
學習記錄 今天我們來嘮一嘮,關於線性表和遞迴的一些想法 一.我們先來談一談什麼是遞迴 1.遞迴,我們都不陌生。非常經典的遞迴模型就是關於漢諾塔問題,在盤子數量很少時 我們可以總結出來一些歸律,發現這些盤子的移動都有共同點 總是先將n 1個盤子借助於輔助塔先從第n個盤子上挪開 然後將第n個放置指定位置...
線性表總結
例 一元多項式及其運算 一元多項式 主要運算 多項式相加 相減 相乘等 分析 如何表示多項式?多項式的關鍵資料 多項式項數n 各項係數ai 及指數 i 方法1 順序儲存結構直接表示 陣列各分量對應多項式各項 a i 項xi的係數ai 方法2 順序儲存結構表示非零項 按指數大小有序儲存!相加過程 從頭...
線性表總結
順序表是將表中的結點依次存放在計算機記憶體中一組位址連續的儲存單元中。將表中元素乙個接乙個的存入一組連續的儲存單元中,這種儲存結構是順序結構。二 單向鍊錶 單向鍊錶 單鏈表 是鍊錶的一種,其特點是鍊錶的鏈結方向是單向的,對鍊錶的訪問要通過順序讀取從頭部開始。三 迴圈鍊錶 它和單鏈表的差別僅在於,判別...