2

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

OCaml function digits : 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 [];;
4

2 回答 2

4

如果您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这里的缺点)。这是编写终端递归函数时非常常见的模式。

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

于 2013-01-10T07:33:07.727 回答
2

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

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

于 2013-01-10T10:38:11.387 回答