2017-05-21 3 views
0

Je suis en train de tableau diviser récursive avec n longueur sur 2 tableaux, jusqu'à ce que je reçois des tableaux n de 1 élément:tableau de division récursive sur des réseaux plus petits en OCaml

let rec split array = 
    if Array.length array = 1 then 
     array 
    else if Array.length array mod 2 = 0 then 
     let a = Array.make (Array.length array /2) 0 in 
     for i = 0 to Array.length a-1 do 
      a.(i) <- array.(i) done; 
     let b = Array.make (Array.length array/2) 0 in 
     for i = Array.length a to Array.length array -1 do 
      b.(i-Array.length a) <- array.(i) done; 
     split a; 
     split b; 
    else 
     let a = Array.make(Array.length array/2 +1) 0 in 
     for i = 0 to Array.length a-1 do 
      a.(i) <- array.(i) done; 
     let b = Array.make (Array.length array/2) 0 in 
     for i = Array.length a to Array.length array -1 do 
      b.(i-Array.length a) <- array.(i) done; 
      split a; 
      split b; 


split [|3;2;4;1|];; 

Cette fonction ne retourne que le dernier élément, mais Je veux revenir quelque chose comme [|3|];[|2|];[|4|];[|1|]

Répondre

4

Si vous voulez vraiment résoudre ce problème en diviser pour mieux régner et de créer des réseaux de plus en plus petits récursive alors ce serait une façon de l'écrire, de revenir en fin de compte la liste des tableaux singleton:

let rec split = function 
    | [||] -> [] 
    | [|x|] as a -> [a] 
    | a -> 
    let i = Array.length a/2 in 
    split (Array.sub a 0 i) @ split (Array.sub a i (Array.length a - i)) 

Mais bien sûr, la création de tous les tableaux intermédiaires est à la fois trop compliquée et inefficace. La définition suivante calcule la même liste mais plus succinctement et plus efficacement:

let split a = Array.fold_right (fun x l -> [|x|]::l) a []