2017-12-05 16 views
-1

Was ich tun möchte, ist alle Teil-Listen einer Liste in Ocaml Erzeugung
zum Beispiel fürin Ocaml

[1; 2; 3]

als Folge ich diese

[[1] erhalten möchten, [2], [3]; [1, 2], [1; 3]; [2, 3] [1; 2 ; 3]]

Das ist mein Ansatz so weit:

let sublist l = 
let rec aux i j max l2= 
match l with 
|[]->l 
|h:t-> if(i=max && j=max) then l2 else if (j<max) then aux i j+1 [h]::tl else 
     aux i+1 i+1 l 
in aux 0 0 (List.length l) [] 
+1

(a) Was ist mit der leeren Liste? Ich würde erwarten, es im Ergebnis zu sehen, da es eine Unterliste jeder Liste ist. (b) Was ist, wenn die Eingabeliste wie folgt aussieht: [[x '; "q"; "b"]? –

+0

Was genau ist das Problem mit dem Code, den Sie haben? Bitte sehen Sie [fragen]. – glennsl

Antwort

1

eine Kluft verwenden und Ansatz erobern: eine nicht-leere Liste gegeben, eine Liste aller Teillisten erhalten, indem das erste Element x und die Lösung des Problems für das Entfernen die restlichen Elemente (über einen Rekursionsschritt).

Wenn der rekursive Aufruf zurückgegeben wird, kombinieren Sie dieses Zwischenergebnis mit dem Element x, das Sie zuvor abgeschnitten haben: Sie müssen jede Unterliste mit x vor und unmodifiziert hinzufügen.

let rec sublists = function 
    | [] -> [[]] 
    | x::xs -> let ls = sublists xs in 
       List.map (fun l -> x::l) ls @ ls;; 

Für Ihr Beispiel Eingabe dieser berechnet:

# Sublisten [1; 2; 3] ;;

-: int Liste Liste = [[1; 2; 3]; [1; 2]; [1; 3]; [1]; [2; 3]; [2]; [3]; []]

Die berechnete Liste kann sortiert und gefiltert werden, je nachdem, ob Sie die leere Liste im Ergebnis haben möchten oder nicht.