需要帮助在 OCaml 中打印 hofstadter 女性序列中的前 N ​​个数字

Need help printing the first N numbers in the hofstadter female sequence in OCaml

我是新来的所以如果我的 post 不好,我提前道歉。 我正在尝试构建一个列表,其中包含以下相互递归的 hofstadter 序列的前 n 个数字:

F(0) = 1
M(0) = 0
F(n) = n - M(F(n-1)), n > 0
M(n) = n - F(M(n-1)), n > 0

我正尝试在 OCaml 中执行此操作,这对我来说是一种新语言。在为这个问题苦苦挣扎了一整天之后,我想到了这个:

open Printf

let list = [];;
let rec female (n: int) = 
    if n == 0 then 1::list
    else let x = n - male(female(n-1)) in x::list
and male (n:int) =
    if n == 0 then 0::list
    else let x = n - female(male(n-1)) in x::list
in female 4;; (** test number*)

let () = List.iter (printf "%d ") list

但它一直在第 8 行产生类型错误,内容为

This pattern matches values of type int but a pattern was expected which matches values of type int list

谁能帮我理解为什么会出现这个错误?函数式编程并不是我的强项。

你有这个子表达式:

male (female (n-1))

由此我们可以得出结论,male的参数与female的结果是同一类型。但就在上面我们看到 female returns 在一种情况下是这样的:

1 :: list

这是一个整数列表。

所以我们知道male的第一个参数应该是一个整数列表。但是,当您实际定义 male 时,您会得到:

and male (n:int) =

编译器告诉您,您对 male 的第一个参数有两个相互冲突的要求。在一个地方它是一个整数列表,在另一个地方(male 本身的定义)你说它是一个整数。

您需要对 malefemale 的参数应该有一个一致的计划。

感谢杰夫的评论,我设法弄明白了。这是我的解决方案:

let rec female (n: int) = 
    match n with
        | 0 -> 1
        | _ -> n - male(female(n-1))
and male (n:int) =
    match n with
        | 0 -> 0
        | _ -> n - female(male(n-1));;
        
let rec l i =
  if i < 10 then female i :: l (i+1) 
  else [] 
  in
List.iter (fun item -> print_int item; print_newline ()) (l 0)

打印 hofstadter 女性序列中的前 10 个数字:6 5 5 4 3 3 2 2 1 1