我让我的F#湿透了,很难理解简单的概念.请帮我解决这个问题,而不是做作业!
说我有一个清单 [1;2;3;4]
如何将其转换为列表元素的所有可能组合的列表:
[(1,2);(1,3);(1,4);(2,3);(2,4);(3,4)]?
我想出了什么:
let tuples=
let lst=[1;2;3;4]
List.map (fun i->(i,i)) lst
Run Code Online (Sandbox Code Playgroud)
显然这会给出错误的结果,但如何继续?我是否只需要使用嵌套for循环方法,我将在C#中编写此代码?
小智 5
您可以使用递归来实现这一点,我相信这被称为"利弊模式"
open NUnit.Framework
open Swensen.Unquote
let convert input =
let rec loop remain acc =
match remain with
| x :: xs ->
let combos = xs |> List.map (fun i -> (x,i))
loop xs (acc@combos)
| x -> acc
loop input []
[<Test>]
let TheTest () =
let actual = convert [1;2;3;4]
let expected = [(1,2);(1,3);(1,4);(2,3);(2,4);(3,4)]
test <@ expected = actual @>
Run Code Online (Sandbox Code Playgroud)