我需要生成1..nx 1..n的所有不同排列的列表,其中第一个值不等于第二个(即生成3 - > [(3,2)::(3,1)::( 2,3)::( 2,1)::(1,3)::(1,2)]
确切的情况是你有一个对象池(卡),每个玩家都有一个.如果一名牌手被发牌,那么其他牌手就不会被发牌(暂时忽略套牌,如果必须的话,我会让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
Run Code Online (Sandbox Code Playgroud)
有更好的方法吗?
您可以使用列表推导轻松完成:
let GenerateTuples (n:int) =
[for i in 1..n do for j in 1..n do if i <> j then yield (i,j)]
Run Code Online (Sandbox Code Playgroud)