【问题标题】:OCaml creating a list of Fibonacci numbersOCaml 创建斐波那契数列
【发布时间】:2023-03-09 04:41:01
【问题描述】:

我有一个生成斐波那契数的函数:

let rec fib n =
    match n with
    | (0 | 1) -> 1
    | x when x > 0 -> (fib (x-2) + fib (x-1))
    | _ -> raise (Invalid_argument "Negative value supplied to fib");;

但我真正想要的是它返回一个所述数字的列表。我试过这个:

let rec fib n list =
    match n with
    | (0 | 1) -> 1 :: []
    | x when x > 0 -> (fib (x-2) list + fib (x-1) list) :: list
    | _ -> raise (Invalid_argument "Negative value supplied to fib");;

但是 ocamlc 说

文件“main.ml”,第 2 行,字符 4-174: 错误:此表达式的类型为 int list 但是需要一个 int 类型的表达式

(第 2 行字符 4-174 对应于匹配块)。我希望它返回类型“int list”,为什么它会推断类型 int?

【问题讨论】:

    标签: ocaml fibonacci


    【解决方案1】:

    如果有人在此处寻找获取斐波那契数列的解决方案,这就是我的解决方案。这一直有效,直到某个值(最大 fib 91)。

    let fib n =
      let rec aux acc n2 n1 = function
      | 1 -> acc
      | c -> aux ((n2 + n1) :: acc) n1 (n2 + n1) (c - 1)
      in
      List.rev(aux [1; 0] 0 1 (n - 1))
    ;;
    

    【讨论】:

      【解决方案2】:

      表达式fib (x - 2) list + fib (x - 1) list 要求fib 返回int,因为(+)int 作为参数。

      【讨论】:

        猜你喜欢
        • 2013-10-04
        • 2015-06-05
        • 2021-10-17
        • 1970-01-01
        • 2013-08-03
        • 2014-05-19
        相关资源
        最近更新 更多