推 lancelet:感謝 01/23 01:31
※ 引述《lancelet (修行非為絕情)》之銘言:
: 雖然是高中的"排列"不過真的把我難倒了
: 望佛心人幫忙,感謝 <(_ _)>
來來來,這問題可以一步一步慢慢想. 先想第一種情況,陣列只有一筆資料:
a[0] = 1
它的排列就是一筆資料,這情況,我們還不知道permu程式是什麼樣子.
所以要再想兩筆資料的情況
a[0] = 1
a[1] = 2
這就先取兩筆資料的任何一個,再把兩筆資料的另一部份也求出排列,然後把頭接上.
所以permu程式變成:
For I = 0 To 1
Head = a[I] '這是排列的頭,可能是1或2
Others = all_but(a, Head) '這是把頭摘掉之後其他資料,要用來做後續排列
...
Next
Others會只剩一筆資料. 假定以上程式是permu函數,則permu對包含兩筆資料的a陣列,
和只包含一筆資料的Others陣列,處理程式一模一樣. 把permu函數的外觀補全:
func permu(array a, length n) as array
if (n <= 1) return a
for i = 0 to n
head = a[i]
others = all_but(a, head) 'all_but函數,要另外寫
o_permus = permu(others, n-1)
array b = {}
for j = 0 to n-1
b = concat(b, concat(head, o_permus[j])) 'concat函數銜接兩陣列為
'一陣列,也要另外寫
next
next
return b
end func
這是個簡單的遞迴混合迴圈的方法.
如果討厭遞迴就要想辦法把遞迴部份展開轉化成純迴圈.
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 218.160.212.178
※ 編輯: yauhh 來自: 218.160.212.178 (01/22 10:32)