2017-01-31 3 views
0

Ich habe eine Liste und einen Wert, wie kann ich Elemente der Liste in eine neue Liste einfügen, bis die Summe dieser Elemente diesen Wert nicht überschreitet?SML: Wie Elemente einer Liste in eine andere neue Liste mit Bedingungen einfügen?

Die Frage ist, wie man die oben erwähnte neue Liste und Anfangsliste ohne Elemente der neuen Liste zurückgibt? Zum Beispiel habe ich eine Liste [13,8,7,6,4,2,2,1] und einen Wert 21. Also möchte ich die Elemente dieser Liste in eine neue Liste einfügen, deren Summe less than or equal to 21 ist. In diesem Beispiel wird eine neue Liste und 13,8 muss aus der ursprünglichen Liste entfernt werden.

so dass die endgültige Ausgabe der Funktion sollte zwei Listen sein: [13,8], [7,6,4,2,2,1]

ich diesen Code geschrieben haben, aber es hat einige verwirrende Fehler:

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 
+0

zum Beispiel i a haben liste [13,8,7,6,4,2,2,1] und einen Wert 21. Also möchte ich die Elemente dieser Liste in eine neue Liste einfügen, deren Summe kleiner oder gleich 21 ist. In diesem Beispiel wird die neue Liste [13,8] und 13,8 müssen aus der ursprünglichen Liste entfernt werden. Also sollte die endgültige Ausgabe der Funktion zwei Listen sein: [13,8], [7,6,4,2,2,1]. –

+0

Es wäre klarer gewesen, wenn Sie Ihren Kommentar als Teil Ihrer Frage hinzufügen könnten. – afxentios

Antwort

1
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] 
Verwandte Themen