關於陣列的遞迴全排列問題

2021-08-18 12:25:08 字數 1383 閱讀 4202

進入大學後每天似乎都在努力學習,但是感覺總是學不會什麼東西。昨天在健身房跟同學聊天,提到學了東西之後可以自己寫一些東西來鞏固記憶和理解。今天剛剛接觸到乙個關於陣列遞迴全排列的問題,看了別人寫的相關介紹,自己根據理解也來獻醜一下。

我這裡寫的陣列全排列問題主要用的就是遞迴的方法來實現這個陣列的全排列問題。

array[4]=,對這個陣列進行全排列。主要思路是:

1.將這個全排列理解為往四個***x中填充數字問題,第乙個x處有四種選擇,第二個x處有三個選擇,第三個x處有兩個選擇,第四個x處只有一種選擇。這樣就將這個問題分解為幾個性質相同的小問題,可以採用遞迴的方法來解決。

2.將上面的思路用程式設計的思想來考慮。

由上面分析可得,首先將問題分解為四個小問題,然後第二步中將第一步中的每個小問題分解為三個小問題,第三步將第二步中的每個子問題又分解為兩個問題。其中每個子問題的性質都是與原問題相似的,先是四個數的全排列,然後是三個數的全排列,然後是兩個數的排列,最後將最後乙個數放在最後的位置。所以是乙個遞迴問題,需要完成的事情相同,只是數目不同而已,所以對應到函式就是功能相同,引數不同。

// 陣列的全排列問題.cpp: 定義控制台應用程式的入口點。

//#include "stdafx.h"

#include using namespace std;

int sum = 0;

void print(int array, int len)

cout << endl;

}void swap(int array, int a, int b)

void permuta(int array, int len, int index)

for (int i = index; i < len; i++) }

int main()

; permuta(array, 4, 0);

cout << sum;

return 0;

}輸出sum為24。

程式的執行思路是先沿著乙個問題遞迴求得下面所有的子問題,然後通過for迴圈求解與其平行的其他子問題。
例如,對於序列4,2,3,1。它有三個子問題,4,2,3,1   4,3,2,1   4,1,3,2,對於最後乙個序列4,1,3,2,有兩個子問題,4,1,3,2   4,1,2,3。這兩個問題已經不能分解,此時的index==len,列印出序列。

這是乙個遞迴到底的過程,然後接下來程式會求解與4,1,3,2平行的兩個序列4,2,3,1   4,3,2,1,求解完成後再返回求解與4,2,3,1平行的三個子問題。

總結:寫的有些不知所云,純粹出於為了增加自己的記憶和理解,每個人的想法可能不一樣。個人認為這個問題中最重要的就是理解for迴圈和遞迴的執行過程,結合在數學層面上對全排列的理解就會很容易明白。

全排列問題(遞迴)

上次上課老師講了全排列演算法,現在剛剛看自己的寫的全排列演算法,看了好一會才看懂。應該是自己理解的不夠徹底 所以今天徹徹底底的來分析一下 先看圖 思路 先固定乙個字元,然後將固定的字元與它後面的每乙個進行交換,一直遞迴下去,直到固定的字元後面只有乙個字元 我們先看看圖,框外面的字元是被固定的字元,框...

關於遞迴解決全排列問題的研究

遞迴是乙個非常重要的解題方法和思路,我們在生活中很多地方都用到了遞迴概念。現有一字串序列,要求我們對其進行全排列,例如 ab 的全排列為 ab 和 ba 編寫程式解決問題。在數學中全排列問題是乙個非常常見的問題,在概率問題中經常出現,通常全排列都是用大寫字母a來表示。我們在數學中確實經常做到全排列的...

排列問題(全排列的遞迴演算法問題)

題目 設計乙個遞迴演算法生成n個元素的全排列。演算法講解 設r 是要進行排列的n個元素,ri r 集合x中元素的全排列記為perm x ri perm x 表示在全排列perm x 的每乙個排列前加上字首得到的排列。r的全排列可歸納定義如下 當n 1時,perm r r 其中r是集合r中唯一的元素 ...