日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

算法设计与分析(第三周)递归实现全排列问题

發布時間:2024/2/28 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 算法设计与分析(第三周)递归实现全排列问题 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

原博地址:https://www.cnblogs.com/zyoung/p/6764371.html

描述

問題是有一組數R,需要輸出它的全排列。R的遞歸可定義如下:
當個數n為1時,Perm? = ?,其中r是集合R中唯一的元素
當個數n大于1時,Perm?由(r1)Perm(R1),(r2)Perm(R2),(r3)Perm(R3),…,(rn)Perm(Rn)構成
其中Ri = R - {ri} 即該集合中減去對應元素

思路


其實說直白點,就是遞歸地把這組數規模一個一個地縮小,如1,2,3,4. 先把1固定,遞歸地求2,3,4的全排列,又把2固定,遞歸地求3,4的全排列……直到只剩一個數,輸出這個排列。
當獲取遞歸數組時,從該組數的第一個,依次和每一位交換(包括本身),得以產生一個新遞歸數組(如1,2,3,4,先是1和1交換,產生新的2,3,4)
當1和1交換產生的所有遞歸完成之后,實際上已經完成了1234,1243,1324,1342,1432,1423的輸出,因為1和自己交換之后,產生了2,3,4
在這個過程中,當1,2,3固定時,只有4剩余,所以輸出1,2,3,4.然后固定1,2,交換3,4的位置。輸出1,2,4,3.此時1,2固定的已經全部輸出,于是返回到只有1固定,那么此時2需要與3交換位置,再進行1,3固定的遞歸
其實說這么多,還不如一張圖來得實在:

代碼 C++

#include<iostream> using namespace std;void swap(int r[], int i, int j) {int t;t = r[i];r[i] = r[j];r[j] = t; }void perm(int r[], int i, int n) {if (i == n)// 只有一個數值{for (int j = 0; j <= n; j++){cout << r[j];// 輸出結果}cout << endl;}else{for (int j = i; j <= n; j++){swap(r, i, j); // 交換r[i]與r[j] perm(r, i + 1, n); // 計算i+1~ n 全排列swap(r, i, j); // 交換r[i]與r[j]}} }int main() {int r[] = { 1,2,3,4 };int i = 0;int n = sizeof(r) / sizeof(r[0]) - 1;perm(r, i, n);system("pause"); }

輸出

1234
1243
1324
1342
1432
1423
2134
2143
2314
2341
2431
2413
3214
3241
3124
3142
3412
3421
4231
4213
4321
4312
4132
4123

總結

以上是生活随笔為你收集整理的算法设计与分析(第三周)递归实现全排列问题的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。