我是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 [];;
答案 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所说,如果你有很多要转换的数字,你会重写以避免重复附加到列表(这需要二次时间并产生大量临时数据)。