【练习回顾】再看全排列
递归
递归直接翻译自我们自己书写全排列时的思路。
\(A_{n}^{n}\) 即为从第1位起到第n位中,每一位均按升序将排列内容遍历。
\[\begin{align*}
A_{n}^{n} & = n \cdot A_{n-1}^{n-1} \\
& = n \cdot (n-1) A_{n-2}^{n-2} \\
& = \ ... \\
\end{align*}
\]
#include<stdio.h>
#define MAXN 10
#define PRINT(A) for(int i=0;i<N;++i)printf("%d ",A[i]);puts("")
/* print full_permutation of 1~N */
int N;
int IsUsed[MAXN],Arr[MAXN]; //IsUsed[i]==1 means i+1 is used
void fullPermutation(int index){
if(index >= N){
PRINT(Arr);
return;
}
for(int i=0;i<N;++i){
if(IsUsed[i] == 0){
Arr[index] = i+1; //在排列中index位置填入一个数
IsUsed[i] = 1;
fullPermutation(index+1);
IsUsed[i] = 0;
}
}
}
int main(){
scanf("%d",&N);
fullPermutation(0);
return 0;
}
非递归
要把自然的逻辑肢解成数字规律