我正在学习OCaml,并且我正在努力解决这个问题。
练习是取一个整数并输出每个偶数整数到这个整数,如下所示:
输入:5 输出:“0-2-4”
输入:10 输出:“0-2-4-6-8”
我必须为负值,字符串输入,类似的东西包含错误。
我正在考虑做一个递归函数并使用模式匹配来设置边缘情况并停止递归。
我的问题是,我来自Ruby,而在Ruby中我的方法是简单地创建一个直到输入的整数数组,然后使用array.select,array.filter等修改该数组,并且将数组的内容连接成一个字符串。我在OCaml做这样的事情要困难得多。
任何提示?
答案 0 :(得分:3)
你可以在OCaml中使用你的Ruby方法,事实上,以这种方式工作是非常惯用的。您可能希望使用列表而不是数组。我不知道有一个内置函数来获取最大值的整数列表,但是编写一个很容易。之后,您可以使用List.filter
从列表中选择所需的元素。
如果允许使用额外的库,OCaml Batteries Included中有许多有用的功能。在快速查看BatList
模块之后,我想出了一个小于n的整数范围的函数:
let range n = BatList.init n (fun x -> x)
答案 1 :(得分:1)
从
开始let output_even_less_then n =
let rec outloop i n =
if i < n then begin
Printf.printf "%d\n" i;
outloop (i+2) n
end
in
outloop 0 n
然后通过输入和有效性测试完成它
答案 2 :(得分:0)
您还可以使用简单的while
循环,这可能更容易理解一开始。
以前答案的功能样式可以稍微提高效率。
let exercise () =
let line = input_line stdin in
let n =
try int_of_string line
with e ->
Printf.eprintf "Could not parse line '%s'\n%!" line;
exit 1
in
if n < 0
then Printf.eprintf "%i is negative\n%!" n;
let i = ref 0 in
while !i < n do
Printf.printf "%i\n" !i;
i := !i + 2;
done
;;
exercise ()