如何解决需要帮助在 OCaml
我是新来的,所以如果我的帖子很差,我提前道歉。 我正在尝试构建一个包含以下相互递归 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 行产生类型错误,内容为
此模式匹配 int 类型的值 但预期的模式与 int list 类型的值相匹配
有人能帮我理解为什么我会收到这个错误吗?函数式编程并不是我的强项。
解决方法
你有这个子表达式:
male (female (n-1))
由此我们可以得出结论,male
的参数与 female
的结果类型相同。但就在上面,我们看到 female
在一种情况下返回:
1 :: list
这是一个整数列表。
所以我们知道 male
的第一个参数应该是一个整数列表。但是,当您实际定义 male
时,您会得到:
and male (n:int) =
编译器告诉您,您对 male
的第一个参数有两个相互冲突的要求。在一个地方它是一个整数列表,而在另一个地方(male
本身的定义)你说它是一个整数。
对于 male
和 female
的参数应该是什么,您需要有一个一致的计划。
我设法弄明白了,感谢 jeff 在评论中。这是我的解决方案:
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
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。