遞迴下降分析程式設計 演算法講解之遞迴演算法

2021-10-18 01:58:09 字數 3100 閱讀 5144

前面已經介紹了關於遞迴呼叫這樣一種操作,而遞迴程式設計是c++語言程式設計中的一種重要的方法,它使許多複雜的問題變得簡單,容易解決了。

遞迴特點是:函式或過程呼叫它自己本身。其中直接呼叫自己稱為直接遞迴,而將a呼叫b,b以呼叫a的遞迴叫做間接遞迴。

【例1】給定n(n>=1),用遞迴的方法計算1+2+3+4+...+(n-1)+n。

【演算法分析】

本題可以用遞迴方法求解,其原因在於它符合遞迴的三個條件:

(1)本題是累加問題:當前和=前一次和+當前項,而前一次和的計算方法與其相同,只是資料不同s(n)=s(n-1)+n;

(2)給定n,所以是有限次的遞迴呼叫;

(3)結束條件是當n=1,則s=1。

#include​

using namespace std;

​int fac(int); //遞迴函式

​int main()

​  void search(int x,int top,int bot) //二分查詢遞迴過程  ​

​​

程式定義了把n片從a柱移到c柱的過程mov (n,a,c,b),這個過程把移動分為以下三步來進行:

①先呼叫過程mov (n-1, a, b, c),把(n-1)片從a柱移到b柱, c柱作為過渡柱;

②直接執行 writeln(a, 』-->』, c),把a柱上剩下的一片直接移到c柱上,;

③呼叫mov (n-1,b,c,a),把b柱上的(n-1)片從b移到c柱上,a柱是過渡柱。

對於b柱上的(n-1)片如何移到c柱,仍然呼叫上述的三步。只是把(n-1)當成了n,每呼叫一次,要移到目標柱上的片數n就減少了一片,直至減少到n=0時就退出,不再呼叫。exit是退出指令,執行該指令能在迴圈或遞迴呼叫過程中一下子全部退出來。

mov過程**現了自己呼叫自己的情況,在pascal中稱為遞迴呼叫,這是pascal語言的乙個特色。對於沒有遞迴呼叫功能的程式語言,則需要將遞迴過程重新設計為非遞迴過程的程式。

【例4】用遞迴的方法求斐波那契數列中的第n個數

【例6】數的計數(noip2001)【問題描述】我們要求找出具有下列性質數的個數(包括輸入的自然數n)。先輸入乙個自然數n(n≤1000),然後對此自然數按照如下方法進行處理:

不作任何處理;

在它的左邊加上乙個自然數,但該自然數不能超過原數的一半;

加上數後,繼續按此規則進行處理,直到不能再加自然數為止。

輸入:自然數n(n≤1000)

輸出:滿足條件的數

【輸入樣例】

6 滿足條件的數為 6 (此部分不必輸出)

【輸出樣例】

【方法一】

用遞迴,f(n)=1+f(1)+f(2)+…+f(div/2),當n較大時會超時,時間應該為指數級。

#includeusing namespace std;

int ans;

void dfs(int m) //統計m所擴充套件出的資料個數

int main()

【方法二】:用記憶化搜尋,實際上是對方法一的改進。設h[i]表示自然數i滿足題意三個條件的數的個數。如果用遞迴求解,會重複來求一些子問題。例如在求h[4]時,需要再求h[1]和h[2]的值。現在我們用h陣列記錄在記憶求解過程中得出的所有子問題的解,當遇到重疊子問題時,直接使用前面記憶的結果。

#includeusing namespace std;

int h[1001];

void dfs(int m)

}int main()

【方法三】用遞推,用h(n)表示自然數n所能擴充套件的資料個數,則h(1)=1, h(2)=2, h(3)=2, h(4)=4, h(5)=4, h(6)=6, h(7)=6, h(8)=10, h(9)=10.分析以上資料,可得遞推公式:h(i)=1+h(1)+h(2)+…+h(i/2)。此演算法的時間度為o(n*n)。

設h[i]-i按照規則擴充套件出的自然數個數(1≤i≤n)。下表列出了h[i]值及其方案:

}【方法四】是對方法三的改進,我們定義陣列s,s(x)=h(1)+h(2)+…+h(x),h(x)=s(x)-s(x-1),此演算法的時間複雜度可降到o(n)

#includeusing namespace std;

int h[1001],s[1001];

int main()

cout << h[n];

return 0;

}

【方法五】還是用遞推,只要作仔細分析,其實我們還可以得到以下的遞推公式:

(1)當i為奇數時,h(i)=h(i-1);

(2)當i為偶數時,h(i)=h(i-1)+h(i/2).

#includeusing namespace std;

int h[1001];

int main()

cout << h[n];

return 0;

}

遞迴下降分析程式

編譯原理 include include include file fp char sym char buff 100 int left p 0,right p 0 void proc e void proc e1 void proc t void proc t1 void proc f void ...

遞迴下降分析程式

實驗一 遞迴下降分析實驗 專業 商業軟體 姓名 李嘉嘉 學號201506110247 一 實驗目的 練習構造遞迴下降語法分析程式的方法,熟悉上下文無關文法的使用,加深對課堂教學的理解 提高語法分析方法的實踐能力。二 實驗內容和要求 利用c語言構造語法分析程式。三 實驗方法 步驟及結果測試 原理分析及...

遞迴下降語法分析

看了這篇部落格之後,總算搞明白了以前編譯原理沒搞懂的ll文法的意義。下面用這種方法實現乙個簡單的計算機器程式 其bnf正規化如下 operator operator operator operator expression 0,1,2,3,4,9 expression operator expres...