需要帮助在 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
本身的定义)你说它是一个整数。
您需要对 male
和 female
的参数应该有一个一致的计划。
感谢杰夫的评论,我设法弄明白了。这是我的解决方案:
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
我是新来的所以如果我的 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
本身的定义)你说它是一个整数。
您需要对 male
和 female
的参数应该有一个一致的计划。
感谢杰夫的评论,我设法弄明白了。这是我的解决方案:
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