ocaml将整数放入列表中

时间:2013-01-10 05:35:30

标签: ocaml

我是ocaml的noobie,我的问题是如何获取ocaml中整数的数字以及如何通过递归调用将它们放入列表中

OCaml函数数字:int - > int list,它将一个整数n作为参数,如果整数是正数,则返回n的数字列表,它们在n中出现的顺序 即:

# digits 3124;;
- : int list = [3;1;2;4] 


# let rec digits n =
  if n >0 then digits(n/10)::[]
  else [];;

2 个答案:

答案 0 :(得分:3)

如果直接将digits写为递归函数,您会发现很难以正确的顺序打印数字,而不会在最后反转整个列表或将元素附加到当前列表的末尾(两种效率都不高的方法。

最好使用中间终端递归函数:

let digits2 d =
    let rec dig acc d =
        if d < 10 then d::acc
        else dig ((d mod 10)::acc) (d/10) in
    dig [] d
;;

这里,dig采用一个累加器,用于构建列表,并在下一个递归调用中传递,并在最后作为整体返回(此处d的缺点除外)。在编写终端递归函数时,这是一种非常常见的模式。

习惯这种写作风格可能需要一点时间,但最终会来。在我看来,尝试重写像这样的简单函数是训练自己的好方法。

答案 1 :(得分:2)

出于学习目的,完成OP的原始代码而不是切换到使用累加器可能很有用。缺少的关键是它没有将当前数字(n mod 10)与递归调用返回的值组合。

正如lbonn所说,如果你有很多要转换的数字,你会重写以避免重复附加到列表(这需要二次时间并产生大量临时数据)。