我需要生成1..nx 1..n所有不同排列的列表,其中第一個值不等於第二個 (即生成3 - > [(3,2):: (3,1)::(2,3)::(2,1)::(1,3)::(1,2)]排列生成器函數F#
確切的場景是你有一個物體池),每個玩家處理一個,如果一個玩家被交易一張牌,則其他玩家不能被處理該牌(暫時忽略西裝,如果必須,我會爲1-52製作一張牌來映射到實際卡)
我想出了以下看起來好像很凌亂
let GenerateTuples (numcards: int) =
let rec cellmaker (cardsleft: int) (cardval:int) =
if cardval = cardsleft then (if cardval <= 0 then [] else cellmaker cardsleft (cardval-1)) elif cardval <= 0 then [] else (cardsleft, cardval) :: cellmaker cardsleft (cardval-1)
let rec generatelists (cardsleft:int) =
cellmaker cardsleft numcards @ (if cardsleft > 1 then generatelists (cardsleft-1) else [])
generatelists numcards
有沒有更好的方法來做到這一點?
根據我的測試,他的實現速度快了13倍。即使我關了很多,也沒有什麼可以打噴嚏。 – ChaosPandion 2010-09-11 00:20:07
謝謝,我知道必須有更聰明的東西,現在去弄清楚列表解析是如何工作的... – Snark 2010-09-11 00:20:51
+1雖然擊敗了我的蹩腳的答案。 :) – ChaosPandion 2010-09-11 00:25:21