演算法筆記 遞迴 產生集合的全排列 整數劃分

2021-10-17 06:59:59 字數 1750 閱讀 8888

# 集合全排列

defperm

(list

, head, tail)

:# 遞迴出口,構成一次全排列,輸出

if head == tail:

for i in

range

(tail+1)

:print

(list

[i], end=

" ")

print()

# 產生head到tail的全排列

else

:for j in

range

(head, tail+1)

:list

[head]

,list

[j]=

list

[j],

list

[head]

# 進行後面的全排列

perm(

list

, head+

1, tail)

# 全排列以後要恢復之前的順序,方便下次進行排列的交換位置

list

[head]

,list

[j]=

list

[j],

list

[head]

if __name__ ==

'__main__'

:list=[

1,2,

3,4,

5,6]

perm(

list,0

,2)# 產生1到3的排列

// 集合全排列

intsplit

(int n,

int m)

intmain()

def

split

(num, max_sum)

:if num ==

1and max_sum ==1:

return

1# 都是1的時候只有一種

elif num < max_sum:

return split(num, num)

# 最大加數不能超過自己

elif num == max_sum:

return split(num, num -1)

+1# 都相等的話,就是1加上退回一位的劃分

else

:return split(num, max_sum -1)

+ split(num - max_sum, max_sum)

# 最大加數是max_sum,說明這個劃分式的頭已經確定是max_sum,我們只要劃分後面的式子就行了

演算法遞迴 集合的全排列問題

設集合 r 顯然全排列的數目為 n!那麼如何顯示集合的所有全排列呢?可以用遞迴的方式實現。解題思路 如果集合有n個元素,那麼就可以看作 n 1個元素全排列之後再加上 剩下的那個元素,因為是全排列,所以每乙個元素都會剩下一次。例如 r 的全排列。若 1 剩下,則 先進行排列,再與1結合,結果是 1 2...

演算法筆記 遞迴實現全排列

假設是求n個數的全排列 首先全排列可以理解為 輸出1開頭的全排列 輸出2開頭的全排列 輸出n開頭的全排列 之後每個數字開頭的全排列內部又可以以同樣的方式劃分,但是顯然前面出現過的數過後面不能再出現 因此,根據上面的思路,就需要乙個長度為n的陣列p來放可能出現的結果,還需要乙個bool型別的陣列has...

全排列遞迴演算法

全排列是將一組數按一定順序進行排列,如果這組數有n個,那麼全排列數為n 個。現以為 例說明如何編寫全排列的遞迴演算法。1 首先看最後兩個數4,5。它們的全排列為4 5和5 4,即以4開頭的5的全排列和以5開頭的4的全排列。由於乙個數的全排列就是其本身,從而得到以上結果。2 再看後三個數3,4,5。它...