數字的全排列
#include <bits/stdc++.h>
using namespace std;//最大的排列數目
const int N=10;
int n;
//存儲排列的路徑
int path[N];
//標記數字是否已經被使用
bool st[N];void dfs(int u){//到達遞歸邊界,輸出一個排列if(u==n){//輸出循環for(int i=0; i<n; i++){cout<<path[i];}//不寫return會繼續往下走return;}//生成排列的主循環//遍歷每個可能的數for(int i=1; i<=n; i++){//如果當前數字i沒有被使用過if(!st[i]){//選擇這個數放在當前位置upath[u]=i;//標記這個數已使用st[i]=true;//遞歸處理下一個位置dfs(u+1);//取消標記(回溯)st[i]=false;}}
}int main(){cin>>n;dfs(0);return 0;
}
語句的執行順序分析
兩點說明:
①u 的回退是由遞歸棧的結構自動處理的,不需要顯式地進行 u-- 操作。
②等遞歸函數執行完后(也就是 return 了),程序才會執行st[i]=false;