全排列遞迴實現

2021-06-30 16:21:53 字數 1216 閱讀 9398

一、 遞迴版本

1、演算法簡述

簡單地說:就是第乙個數分別以後面的數進行交換

e.g:e = (a , b , c),則 prem(e)= a.perm(b,c)+ b.perm(a,c)+ c.perm(a,b)

然後a.perm(b,c)= ab.perm(c)+ ac.perm(b)= abc + acb.依次遞迴進

好了,知道演算法之後就不難編出乙份好的**了。

#include

using

namespace

std;

void swap(char *a, char *b)

//需要三個引數,k表示當前的數,m表示數的個數

void per(char *a, int k, int m)

else

}}int main()

; per(a, 0, 3);

return

0;}

ok,見圖知情況

但是上面**有個缺陷:兩個相同的數也進行了交換,見下圖:

去掉重複符號的全排列:在交換之前可以先判斷兩個符號是否相同,不相同才交換,這個時候需要乙個判斷符號是否相同的函式。

**如下:

#include

using

namespace

std;

void swap(char *a, char *b)

bool isswap(char *a, int k, int i)

if (a[k] == a[i])

else

}//需要三個引數,k表示當前的數,m表示數的個數

遞迴實現全排列

生成全排列的最簡單的遞迴方法的思想 1.可以把幾個數字分成前半部和最後一位。對於0123這四個數來說,最後一位 紅色字型 所出現的情況只有以下四類 先不管前三個數的排列組合情況 3 2 1 0這樣我們就把四個數字的排列問題,變成了3個 對於上述的每一行來說 2.終結條件是1個數字的排列就是其本身。直...

遞迴實現全排列

1 如果運算力,和理亂麻的水平不夠。盡量不要復用本地變數 比如c用來計數,不計數後 又用來做其它比如作為步長 除非你確認不會出現問題。2 盡量讓每個邏輯單元 函式內可以有多個邏輯單元 盡量小,邏輯盡量要清晰 3 語言組織能力有限,就說這些了。未整理,抱歉了 include stdafx.h incl...

全排列 遞迴實現

前面我們介紹了全排列的非遞迴演算法,現在我再來寫一下全排列的遞迴演算法 這兩種演算法的演算法思路並不相同。遞迴演算法的思路比較接近於我們現實生活中的思路。1.試想,我們只有兩個數字 12.要對它進行全排列,第一種方式就是12本身,第二種,將12交換,變為21即可。這提示了我們一種交換的思路。2.但這...