2009-10-15 6 views
2

Pour une affectation, j'ai écrit le code suivant en récursivité. Il prend une liste d'un type de données vectorielles, et un vecteur et calcule à proximité des deux vecteurs. Cette méthode fonctionne bien, mais je ne sais pas comment faire la version récursive.Ocaml - Itératif à récursion

let romulus_iter (x:vector list) (vec:vector) = 
     let vector_close_hash = Hashtbl.create 10 in 
     let prevkey = ref 10000.0 in (* Define previous key to be a large value since we intially want to set closefactor to prev key*) 
     if List.length x = 0 then 
      {a=0.;b=0.} 
     else 
      begin 
      Hashtbl.clear vector_close_hash ; 
      for i = 0 to (List.length x)-1 do 
       let vecinquestion = {a=(List.nth x i).a;b=(List.nth x i).b} in 
       let closefactor = vec_close vecinquestion vec in 
       if(closefactor < !prevkey) then 
        begin 
         prevkey := closefactor; 
         Hashtbl.add vector_close_hash closefactor vecinquestion 
        end 
       done; 
        Hashtbl.find vector_close_hash !prevkey 
      end;; 

Toute aide sera très appréciée

Répondre

3

L'équivalent récursif général de

for i = 0 to (List.length x)-1 do 
    f (List.nth x i) 
done 

est la suivante:

let rec loop = function 
    | x::xs -> f x; loop xs 
    | [] ->() 

Notez que comme une boucle for, cette fonction renvoie uniquement l'unité, bien que vous puissiez définir une fonction récursive similaire renvoyant une valeur significative (et en fa c'est ce que la plupart font). Vous pouvez également utiliser List.iter, qui est destiné uniquement à cette situation où vous appliquez une fonction impure qui ne renvoie rien de significatif à chaque élément de la liste:

List.iter f x 
+0

Merci l'homme, il a finalement cliqué! –