2009-10-15 118 views
2

对于一个赋值,我写了下面的代码递归。它需要一个矢量数据类型和一个矢量的列表,并计算两个矢量的接近度。此方法工作正常,但我不知道如何做递归版本。Ocaml - 迭代递归

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;; 

任何帮助将非常感激

回答

3

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

一般递归相当于是这样的:

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

注意,就像一个for循环,这个功能只返回单位,尽管你可以定义一个类似的递归函数来返回一个有意义的值(在fa中这就是大多数人所做的)。您也可以使用List.iter,这意味着只适用于这种情况下,您应用的不纯功能不会返回任何有意义的内容到列表中的每个项目:

List.iter f x 
+0

感谢的人,它最终点击! – 2009-10-16 01:16:57