1

我正在学习 OCaml 并坚持我正在尝试解决的练习。

练习是取一个整数并输出每个偶数整数,直到该整数,如下所示:

输入:5 输出:“0-2-4”

输入:10 输出:“0-2-4-6-8”

我必须包括负值、字符串输入等错误。

我正在考虑做一个递归函数并使用模式匹配来设置边缘情况并停止递归。

我的问题是,我来自 Ruby,在 Ruby 中,我的方法是简单地创建一个整数数组直到输入,然后使用 array.select、array.filter 等修改该数组,并连接内容将数组转换成字符串。我在 OCaml 中做这样的事情要困难得多。

有小费吗?

4

3 回答 3

3

您可以在 OCaml 中使用您的 Ruby 方法,事实上,以这种方式工作非常地道。您可能想要使用列表而不是数组。我不知道有一个内置函数可以获取最大整数列表,但是写一个很容易。之后,您可以使用List.filter从列表中选择所需的元素。

如果您被允许使用额外的库,OCaml Batteries Included中有许多有用的功能。在快速浏览了这个BatList模块之后,我想出了这个函数来处理小于 n 的整数范围:

let range n = BatList.init n (fun x -> x)
于 2012-07-31T03:59:43.073 回答
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

然后用输入和有效性测试完成它

于 2012-07-31T03:32:23.380 回答
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 ()
于 2012-07-31T06:55:19.997 回答