演算法基礎 遞迴

2021-09-25 18:11:57 字數 1572 閱讀 1483

乙個函式呼叫其自身,就是遞迴

遞迴和普通函式呼叫一樣是通過棧實現的

替代多重迴圈

解決本來就是用遞迴形式定義的問題

將問題分解為規模更小的子問題進行求解

例題:n皇后問題

n皇后問題:輸入整數n, 要求n個西洋棋的皇后,擺在n*n的棋盤上,互相不能攻擊,輸出全部方案。

輸入乙個正整數n,則程式輸出n皇后問題的全部擺法。

輸出結果裡的每一行都代表一種擺法。行裡的第i個數字如果是n,就代表第i行的皇后應該放在第n列。

皇后的行、列編號都是從1開始算。

#include #include using namespace std;

int n;

int queenpos[100];

//用來存放算好的皇后位置。最左上角是(0,0)

void nqueen( int k);

int main()

void nqueen( int k)

for( i = 0;i < n;i ++ )

} if( j == k )

} //for( i = 0;i < n;i ++ )

}

例題:逆波蘭表示式

逆波蘭表示式是一種把運算子前置的算術表示式(其實一般教科書上稱這種表示式為波蘭表示式) ,例如普通的表示式2 + 3的逆波蘭表示法為+ 2 3。逆波蘭表示式的優點是運算子之間不必有優先順序關係,也不必用括號改變運算次序,例如(2 + 3) * 4的逆波蘭表示法為* + 2 3 4。本題求解逆波蘭表示式的值,其中運算子包括+ - * /四個。

輸入:輸入為一行,其中運算子和運算數之間都用空格分隔,運算數是浮點數

輸出:輸出為一行,表示式的值。

本題中「逆波蘭表示式」的定義:

乙個數是乙個逆波蘭表示式,值為該數(遞迴出口

「運算子 逆波蘭表示式 逆波蘭表示式」 是逆波蘭表達

式 , 值為兩個逆波蘭表示式的值運算的結果

#include using namespace std;

double exp()

}int main()

例題:漢諾塔問題(過於經典不再贅述題目詳情)

#include using namespace std;

void hanoi(int n, char src,char mid,char dest)

//將src座上的n個盤子,以mid座為中轉,移動到dest座

hanoi(n-1,src,dest,mid); //先將n-1個盤子從src移動到mid

cout << src << "->" << dest << endl;

//再將乙個盤子從src移動到dest

hanoi(n-1,mid,src,dest); //最後將n-1個盤子從mid移動到dest

return ;

}int main()

演算法基礎 遞迴演算法

遞迴演算法是將重複問題分解為同類的子問題而解決問題的方法,其核心思想是分治策略。簡單來說就是自己呼叫自己。直到達到退出遞迴的條件,則完成遞迴。1 找整個遞迴的終止條件 遞迴應該在什麼時候結束?3 本級遞迴應該做什麼 在這一級遞迴中,應該完成什麼任務?優點 遞迴的核心思想就是將乙個大問題,拆解成乙個小...

基礎演算法 遞迴

遞迴用處很廣,可以將複雜問題簡單化。很多問題都可以使用遞迴演算法或結合遞迴演算法得到解決。那麼,設計遞迴演算法的關鍵是什麼?其關鍵之處在於,正確分析出2種型別的節點 出口節點和入口節點 一 演算法關鍵 出口節點 入口節點 遞迴問題可看做是由各個節點構成,而所有節點只能分為出口節點 入口節點兩類。1 ...

演算法 遞迴基礎

資料結構 int st n 記錄每個位置當前的狀態 0還沒考慮,1表示選它,2表示不選它 include include include include using namespace std const int n 16 int n int st n 記錄每個位置當前的狀態 0還沒考慮,1表示選它...