自寫 求全排列 新演算法 遞迴實現

2021-05-23 08:30:56 字數 2204 閱讀 7873

演算法思想從根本上區別於網 上的諸多方法,思想基於把用來儲存一組數形成的所有序列的二維陣列看成乙個表(每個排列都是豎著放的,看著順眼)。而使用遞迴進行了類似於把表從上到下一行一行的填滿,有幾個數就有幾層遞迴(每層有多個遞迴)。這次關鍵乙個遞迴函式(只有30左右行),但從構思到寫**到除錯完成,花了將近一天半。還是紙上打稿,在寫**,最關鍵就在於畫圖了,根據圖來寫**。

舉例:當一組數為4個是(1,2,3,4)總排列數為(4*3*2*1)

分別以1,2,3,4開頭的序列各為6個(也就是以相同的乙個數開頭的有3*2*1個)

所以第一行分別連需填6個1,6個2,6個3,6個4;

而以1開頭的,它的下一行往後相當於(對除1以外的其他數(2,3,4)的所有排列(用遞迴了));

以2開頭。。。。。。。。。。。。。。。。。。。。。。。(1,3,4)。。。。。。。。。。。。;

以3開頭。。。。。。。。。。。。。。。。。。。。。。。(1,2,4)。。。。。。。。。。。。;

以4開頭。。。。。。。。。。。。。。。。。。。。。。。(1,3,2)。。。。。。。。。。。。;

就這樣從上往下一行一行地填表;

普遍性:當一組數為n個(a1,a2,a3...........an)總排列數為an*......*a3*a2*a1;

分別以a1,a2,a3,.....an開頭的序列各有(an-1*..........a3*a2*a1)(也就是總排列數除以數的總數)

此時的二維陣列為【n】【總排列數】;看成**進行填表;一層一層的填;

using system;

using system.collections.generic;

using system.linq;

using system.text;

for (int i = 0; i < item_num; i++)

// int item = new int[4] ;

// int[,] xulie = new int[4, 24];

qiongju(xulie, 0, 0, item);//進行重複的排列

/* int a = new int[5] ;

int b = new int[4];

newarray(a, b, 4);

for (int i = 0; i < 4; i++)

*/// bool insert==false;

int[,] n_xulie = new int[item_num, pailie_num];//將重複的排列刪了,剩下的都存入這個新陣列中;

int x_count=0;//上面新陣列存的數的個數

//////

///以下的迴圈執行刪除並存放的操作,畫個圖比較容易看懂

///for (int i = 0; i < pailie_num-1; i++)

}if (flag == item_num)

}if (insert == true)

x_count++;

}if (i ==pailie_num-2 )

x_count++;}}

for (int a = 0; a < x_count; a++)

// test(xulie, 4, 24);

//console.writeline("zhangbilei");

console.readline();

}///

/將array看成乙個橫向(列數為x),豎向(行數為y);利用遞迴進行類似於填表的操作

/對陣列array的每一行進行填數,陣列的每一列為乙個序列,行數為總序列數目

//y_start用來記錄要填充的當前行,///

static void qiongju(int[,] array, int y_start, int x_start, int item)

////以下作用:當前行中相同數進入下一層使用遞迴,y_index用於遞迴(區別於y_start,相當於進入遞迴後作為y_start)

/int new_num = item_num - 1;

if (new_num > 0)}}

}/// // ///

/// /// ///

/// /// ///將old陣列中下標不為deleted_index的數存入陣列new中;

/// /// // ///

///

static void newarray(int old, int new, int delete_index)}}

}}

求全排列演算法簡單的實現

求全排列演算法實現 一 遞迴實現 假如是乙個陣列,無重複元素的全排列,其簡單的遞迴實現演算法思想如下 假如 allsort a b c 分治思想化為a allsort b c b allsort a c c allsort a b 遞迴一層後計算第二層時 如allsort b c 時,化為b all...

遞迴演算法實現全排列

輸入乙個字串,列印出該字串中字元的所有排列。例如輸入字串abc,則輸出由字元a,b,c所能排列出來的所有字串 程式如下 include using namespace std void swap char a,char b void permutation char str,int k,int m ...

全排列演算法遞迴實現

前言 在一些演算法題當中有時需要進行全排列,是乙個比較簡單的遞迴呼叫,在這裡記錄下,以後可以直接拿來使用。過程 例如 第一步 和的全排列組合 和的全排列組合 和的全排列組合 第二步 針對這個集合在拆分為 和的全排列組合 和的全排列組合 之後就是模擬如此。集合中每個元素和剩下元素的全排列的組合。在對這...