SML:如何将一个列表的元素插入到另一个有条件的新列表中?
SML: How to insert elements of a list to another new list with conditions?
我有一个列表和一个值,如何将列表中的元素插入到新列表中,直到这些元素的总和不超过该值?
问题是如何return前面提到的没有新列表元素的新列表和初始列表?
例如,我有一个列表 [13,8,7,6,4,2,2,1]
和一个值 21
。所以,我想将该列表的元素插入到一个新列表中,它们的总和为 less than or equal to 21
。在此示例中,新列表将是 [13,8]
并且 13,8
必须从初始列表中删除。
所以函数的最终输出应该是两个列表:[13,8]
,[7,6,4,2,2,1]
我写了这段代码,但它有一些令人困惑的错误:
fun Scheduler (w:Wopt , L:PTList)=
let
val ptl1=[List.hd L]
val TempL=L
val head=List.hd L
in
if ListSum(ptl1) = w
then (ptl1, Delete(L))
else (
if ListSum(ptl1) + head <= w
then Scheduler(Insert(head,ptl1), Delete(TempL))
else (ptl1,Delete(L))
)
end
fun splitFor n [] = ([], [])
| splitFor n (x::xs) =
if x > n then ([], x::xs) else
let val (ys, zs) = splitFor (n - x) xs
in (x::ys, zs) end
(* Example *)
val (a, b) = splitFor 21 [13,8,7,6,4,2,2,1]
我有一个列表和一个值,如何将列表中的元素插入到新列表中,直到这些元素的总和不超过该值?
问题是如何return前面提到的没有新列表元素的新列表和初始列表?
例如,我有一个列表 [13,8,7,6,4,2,2,1]
和一个值 21
。所以,我想将该列表的元素插入到一个新列表中,它们的总和为 less than or equal to 21
。在此示例中,新列表将是 [13,8]
并且 13,8
必须从初始列表中删除。
所以函数的最终输出应该是两个列表:[13,8]
,[7,6,4,2,2,1]
我写了这段代码,但它有一些令人困惑的错误:
fun Scheduler (w:Wopt , L:PTList)=
let
val ptl1=[List.hd L]
val TempL=L
val head=List.hd L
in
if ListSum(ptl1) = w
then (ptl1, Delete(L))
else (
if ListSum(ptl1) + head <= w
then Scheduler(Insert(head,ptl1), Delete(TempL))
else (ptl1,Delete(L))
)
end
fun splitFor n [] = ([], [])
| splitFor n (x::xs) =
if x > n then ([], x::xs) else
let val (ys, zs) = splitFor (n - x) xs
in (x::ys, zs) end
(* Example *)
val (a, b) = splitFor 21 [13,8,7,6,4,2,2,1]