我正在为课堂做一个练习,经过一段时间的思考,我找到了理论上的方法,但无法弄清楚在 Haskell 中的方法。
练习是:
xs
有一个包含不同元素的列表n
。从到的n
列表元素的组合(与)是可以从原始元素形成的所有可能的元素集(没有重复) 。xs
m
m
m <= n
m
n
元素的顺序并不重要(这意味着
"abc"
被视为与 相同的组合"bca"
)。例如:
Run Code Online (Sandbox Code Playgroud)comb 0 "abcd" -> [""] comb 3 "bcd" -> ["bcd"] comb 2 "bcd" -> ["cd","bd","bc"] comb 3 "abcd" -> ["bcd", "acd", "abd", "abc"]
定义一个函数
comb
,该函数接受一个自然数和一个包含不同元素的m
列表。xs
n
我能找到的唯一方法是我需要一个值来表示我的“位置指针” pp
,这样它将删除length xs - m
该指针之后的元素,然后在递归调用中删除元素m + pp
,因此它“跳转”到下一个位置。我将以一种伪 Haskell 方式编写一个示例:
m = 3 xs = "abcd" * = pp
*abcd …
Run Code Online (Sandbox Code Playgroud)