簡單的遞迴和遞推

2021-10-03 22:19:11 字數 1409 閱讀 6175

1.遞迴實現指數型列舉

題意:從 1~n 這 n 個整數中隨機選取任意多個,輸出所有可能的選擇方案。要求同一行內的數必須公升序排列。

思路:每個數有倆種情況,選中和不選中。由於要公升序排列,遞迴可以實現,不管選與不選都是從小到大排列的。並且選與不選沒有順序之分。

**:

#include #include using namespace std;

const int n=20;

int st[n];

int n;

void dfs(int u)

printf("\n");

return ;

}//選

st[u]=1;

dfs(u+1);

st[u]=0;

//不選

st[u]=2;

dfs(u+1);

st[u]=0;

}int main()

2.遞迴實現排列型列舉

題意:把 1~n 這 n 個整數排成一行後隨機打亂順序,輸出所有可能的次序。

要求按照從小到大的順序輸出所有方案,每行1個。

思路:這就是乙個排列問題,每乙個數都要輸出,只是輸出的順序問題,很顯然用遞迴來遍歷比較好。輸出結果按從小到大的順序輸出,所以從1開始遍歷。這裡要用乙個陣列來記錄下順序。

**:

#include #include using namespace std;

const int n=10;

int path[n];

bool st[n];

int n;

void dfs(int u)

for(int i=1;i<=n;i++)

}int main()

3.斐波那契數列的非遞迴實現

題意:以下數列0 1 1 2 3 5 8 13 21 …被稱為斐波納契數列。

這個數列從第3項開始,每一項都等於前兩項之和。

輸入乙個整數n,請你輸出這個序列的前n項。

思路:斐波那契的遞迴實現太耗費時間和空間,在比賽的時候基本都不能用,所以這裡要非遞迴來實現,可以用陣列進行預處理,一次迴圈就能得到所有的結果。

**:

#include #include using namespace std;

const int n=50;

int f[n];

int main()

//選st[u]=true;

path[cnt]=u;

dfs(u+1,cnt+1);

st[u]=false;

//不選

st[u]=true;

dfs(u+1,cnt);

st[u]=false;

}int main()

遞迴和遞推

遞迴的概念 乙個函式 過程 概念或資料結構,如果在其定義或說明內部直接或間接地出現有其本身的引用,或者是為了描述問題的某一狀態,必須用到它的上一狀態,而描述上一狀態,又必須用到它的上一狀態 這種用自己來定義的方法,稱之為遞迴或者遞迴定義。在程式設計中,過程或函式直接或者間接呼叫自己,就稱為遞迴呼叫 ...

遞推和遞迴

貪心的思想可以用一句話來歸納,每步取優 很好理解,假設你的程式要走i 1 n共n步,那麼保證你的第i步走出的是當前這一步的最優值。這樣的解題方法叫做貪心演算法。可見貪心演算法並不是乙個全面的列舉方法而是若干結果中的一種,僅僅一種而已。但這種演算法是不是最優解它就不能完全保證了。一般每個可以使用遞迴演...

遞推和遞迴

一 遞推演算法基本思想 遞推演算法是一種理性思維模式的代表,其根據已有的資料和關係,逐步推導而得到結果。遞推演算法的執行過程如下 1 根據已有的 結果和關係,求解中間結果 2 判定是否達到要求,如果沒有達到,則繼續根據已知結果和關係求解中間結果 如果滿足要求,則表示尋找到乙個正確的答案。遞推演算法往...