2017-03-08 9 views
0

Überschneidung [1; 2; 2; 3; 4; 4; 3] [2; 3] = [2; 2; 3; 3]Ocaml Rekursion

Es ist etwas falsch mit meinem Code, weil es zur Zeit gibt [2; 2] zurück, da es nicht mit t2 übereinstimmt, nur h2, hat jemand irgendwelche Vorschläge bezüglich der Richtung, in die ich denken sollte, um dies zu ändern?

let rec intersection (l1: int list) (l2: int list) : int list = 
    begin match l1, l2 with 
    | h1::t1, h2::t2 -> if h1=h2 then h1::intersection t1 l2 
           else intersection t1 l2 
    | _ -> [] 
    end 

Antwort

0

Beachten Sie, dass beide Ihrer rekursiven Aufrufe l2, die gesamte zweite Liste übergeben. Dies bedeutet, dass h2 immer auf dasselbe Element verweist, das erste Element der zweiten Liste. Dies erklärt, warum Sie in Ihrem Beispiel nur Treffer auf 2 bekommen.

Sie müssen tiefer in die zweite Liste schauen.

Als Nebenkommentar wird diese Funktion nicht einfach als eine einzelne rekursive Funktion IMHO dargestellt. Es könnte besser sein, an zwei getrennte Unteroperationen zu denken. Insbesondere interessiert Sie, ob ein Int in l2 erscheint und das ist seine eigene separate Frage.

+0

Vielen Dank für den hilfreichen Kommentar! (zur Kenntnis genommen) – user