演算法 08 遞迴與非遞迴

2021-04-12 21:36:43 字數 893 閱讀 8009

我們曾經討論過,遞迴程式在解決大規模問題時,經常會導致程式效能下降甚至不可用,因此我們研究遞迴只是通過遞迴來分析問題的特性,最終將遞迴程式轉化為非遞迴程式實現。

首先我們先看乙個用分治法(遞迴)畫刻尺的問題:

在刻尺上每個英吋的1/2英吋點處做乙個標記,在1/4英吋的間隔處做乙個稍短的標記,在1/8英吋的間隔處做乙個更短的標記,依次類推。我們的任務是在給定的解析度下來作這些標記的程式。

如果我們需要的解析度是1/2^n英吋,我們就應該在0和2^n之間的每個點作乙個標記,不包括端點。因此中間的標記應當是n個單位高,左(右)半部分中間的標記是n-1個單位高。

//程式適用於r-l=2的冪的情況

static

void

rule(

intl,

intr,

inth)

該方法的思想如下:為了在中間做乙個長標記,首先把間隔分成相等的兩半;然後在左半部分作乙個短一些的標記(遞迴的);然後在右半部分作乙個短一些的標記(遞迴的)。這個程式與漢諾塔的問題遞迴的順序是相同的。

static

void

rule(

intl,

intr, 

inth)

...

在這裡,我們先畫出長度為1的所有標記,然後再畫長度為2的所有標記,依次類推。變數t存放了標記的長度,變數j存放了兩個連續的長度為t的標記之間的個數。外部for迴圈步進值為t,並保持了j=2^(t-1)。內部for迴圈畫出所有長度為t的標記。

我們交替地畫長度為1的標記並跳過位置,然後交替地畫長度為2的標記並跳過剩餘的位置,再交替地畫長度為3的標記並跳過剩餘的位置。

自底向上的方法與一般的演算法設計思路是一樣的,即總是先解決那些容易的子問題,然後把這些解結合起來,從而解決稍大的問題,直到整個問題的解決。這種方法叫合治法。 

遞迴與非遞迴演算法

一 題目分析 將非負十進位制整n轉換成b進製 其中b 2 16 將任意正整數n用2的冪次方表示 二 演算法設計 1 轉換進製問題 exer.cpp 遞迴演算法 遞迴出口 n b b 遞迴表示式 f n,b f n b,b n b b 遞迴棧表示 2 用二的冪次方表示任意正整數n問題 exer2.cp...

Ackerman的遞迴與非遞迴演算法

已知ackerman函式的定義如下 a km m,n n 1,text akm m 1,1 m neq 0,n 0 akm m 1,akm m,n 1 m neq 0,n neq 0 end akm m,n n 1 akm m 1 1 akm m 1,akm m,n 1 m 0m 0,n 0m 0 ...

演算法 歸併演算法的遞迴與非遞迴形式

歸併演算法是將兩個或兩個以上的有序表組合成乙個新的有序表,它的原理是 假設初始序列含有n個記錄,則可以看成是n個有序子串行,兩兩歸併,得到 n 2 個有序子串行,再次歸併 不斷重複直至歸併到長度為n的有序序列,這樣的排序方法稱為2路歸併排序。例項一 遞迴形式的2路歸併演算法 define maxsi...