我有以下代码来计算Hofstadter H序列,但是我收到了过载冲突错误消息。我对SML相当陌生,因此我确定错误是指什么。
(* Hofstadter H-Sequence *)
fun H(0) = [0]
| H(n) = if n = 0 then [0] else x :: (n - H(H(H(n - 1))));
我的目标是将每次迭代的值插入列表中并显示出来。 例如:H 10; -> [1、2、3、4、4、5、5、6、7]
答案 0 :(得分:1)
您正在尝试编写类型为int -> int list
的函数。
(即使SML可以推断出它们的类型,这也是一个好主意。一个好的类型系统就像自动对焦。)
您不能从数字(n - H(...)
)中减去此函数的结果,因为它是一个列表,也无法将列表传递给此函数– H(H(n - 1))
–因为它想要一个号。
(第一个元素x
是从哪里来的?)
从一个简单的函数开始,该函数只是H(n)
的定义:
fun H 0 = 0
| H n = n - H(H(H(n-1)))
测试:
- H 0;
val it = 0 : int
- H 1;
val it = 1 : int
- H 2;
val it = 1 : int
- H 4;
val it = 3 : int
然后使用它来逐步建立列表。
此变体使用本地定义的辅助函数,该函数使用当前索引和计数器:
fun H_seq n = let fun H_seq' m e =
if m < e
then (H m) :: (H_seq' (m+1) e)
else []
in
H_seq' 0 n
end;
示例:
- H_seq 10;
val it = [0,1,1,2,3,4,4,5,5,6] : int list
这效率很低,但是修复是更高级课程的一部分...