[英]Represent a nil list and/or a list(nil)
我们正在F#中实现此算法。
Topor(1982)提供了有关该算法使用的符号的更多信息:
形式上,
't list
为null
(表示为nil
)或具有hd
(为't
)和tl
(为't list
)...如果x
为列表,则我们测试其是否为null
通过写null x
...我们创建一个新列表,将元素a
添加到现有列表x
的前面,方法是编写a:x
...我们用list(a)
表示包含元素a
的单元列表。list(x) = x:nil
。
我们想知道的是在F#中如何表达那些nil
, null
和list(nil)
值。 例如,我们应该使用Option类型,空列表还是其他?
let rec kpermute k (xs: 't list) =
let rec mapPerm k xs ys =
match ys with
| [] -> []
| head::tail ->
let kpermuteNext = kpermute (k-1) (removeFirst head xs)
let mapPermNext = mapPerm k xs tail
mapcons head kpermuteNext mapPermNext
match k with
| 0 -> [[]]
| _ when xs.Length < k -> []
| _ -> mapPerm k xs xs
处理列表时,对于list(nil)
我们使用[[]]
,对于nil
我们使用[]
。 没关系,但是可能会有一种更具表现力的方式来做到这一点。 有时候,当类型推断需要更多信息时,我们使用List.empty<'t list>
和List.empty<'t>
。
本文为您提供了所有答案: nil
为[]
; null x
是x
是否为空列表的检验; list(nil)
是[[]]
。
算法B到F#的简单转换如下:
let rec minus a = function
| [] -> failwith "empty list"
| xh :: xt -> if xh = a then xt else xh :: minus a xt
let rec permute2 k x =
if k = 0 then [[]]
elif List.length x < k then []
else mapperm k x x
and mapperm k x = function
| [] -> []
| yh :: yt -> mapcons yh (permute2 (minus yh x)) (mapperm x yt)
and mapcons a ps qs =
match ps with
| [] -> qs
| ph :: pt -> a :: ph :: mapcons a pt qs
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.