(* Programmieraufgabe P-43 (fold.ml) *) (* Leonhard Fellermayr *) (* Mat.Nr. 22128130XXXX *) exception Leeres_Array;; (* array_part : Teilt ein Array a gleichmaessig auf und gibt die gewuenschte Haelfte part zurueck. part kann die Werte 0 (fuer links) oder 1 (fuer rechts) haben Bei unvermeidlicher Ungleichverteilung (sprich: wenn a ungerade Laenge hat) fŠllt die RECHTE Haelfte des Arrays um 1 laenger aus als die linke (an sich beliebig, hier aber so definiert) *) let rec array_part a part = let alen = Array.length (a) in let half = alen / 2 in if (part == 0) then Array.sub a 0 half else Array.sub a half (alen-half);; (* fold_balanced : Die geforderte Funktion *) let rec fold_balanced f a = match (Array.length a) with 0 -> raise Leeres_Array | 1 -> Array.get a 0 | _ -> f (fold_balanced f (array_part a 0)) (fold_balanced f (array_part a 1));; (* Beispiel-Arrays und -Funktion zum Testen *) let f x y = x+y;; let a1 = [|0;1;2;3;4|];; let a2 = [|0|];; let a3 = [||];; (* EOF *)