我需要生成一个列表,其中包含1..n x 1..n的所有不同排列,其中第一个值不等于第二个值(例如,生成3 -> [(3,2):: (3,1):: (2,3) ::(2,1)::(1,3)::(1,2)])。
具体情况是,您有一堆对象(牌),每个玩家都会得到一张牌。如果某个玩家得到了一张牌,则其他玩家将不能得到该牌(暂时忽略花色,如果必要,我将为1-52制作一个映射表以映射实际牌)。
我想出了以下代码,但看起来最好还需改进。
具体情况是,您有一堆对象(牌),每个玩家都会得到一张牌。如果某个玩家得到了一张牌,则其他玩家将不能得到该牌(暂时忽略花色,如果必要,我将为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
有没有更好的方法来做这件事?