Ocaml 在河内塔中使用列表

Ocaml 在河内塔中使用列表,ocaml,Ocaml,我是Ocaml的新手,我试图为河内塔编程 我的代码似乎一直工作到现在,我打印磁盘在棒之间的移动 这是我的密码: let hanoi n = let rec hanoi_rec n s e i = if n > 0 then ( hanoi_rec (n - 1) s i e;

我是Ocaml的新手,我试图为河内塔编程

我的代码似乎一直工作到现在,我打印磁盘在棒之间的移动

这是我的密码:

let hanoi n = let rec hanoi_rec n s e i = if n > 0 then
                                          (
                                           hanoi_rec (n - 1) s i e;
                                           let str = "Move disc from " ^ string_of_int s ^ " to " ^ string_of_int e ^ "\n" in
                                           print_string(str);
                                           hanoi_rec (n - 1) i e s
                                           )
    in hanoi_rec n 1 2 3

where n = numbers of disks
s = beginning
e = end
i = internediate
我称之为:

let main () = hanoi 2 
let _ = main ();;
并打印到屏幕上

将光盘从1移动到3
将光盘从1移动到2
将光盘从3移动到2


现在我想创建一个移动列表,而不仅仅是打印它。例如,“
[1;3;1;2;3;2]
”。我该怎么做?

您当前的代码是必需的;i、 例如,它按顺序执行一系列操作以创建其输出

如果您想保持这个命令性字符,可以使用OCaml的不纯特征。创建一个可变全局列表(一个
int-list-ref
)。将新值添加到列表的开头,而不是打印结果。然后在最后,颠倒列表


另一方面,学习OCaml的一个主要原因是学习从功能上编程。您可以在不使用全局值或可变值的情况下解决此问题。我怀疑一般的方法是让河内rec返回一个移动列表。这是我的建议,因为我相信功能性思维应该存在于每个程序员的工具包中。

我尝试从功能性角度来思考,就像你说的,但不起作用,我看不到这种方法。我试图返回一个列表,但没有成功。我尝试了(hanoi_rec(n-1)s I e):[s;e]:(hanoi_rec(n-1)I e s),但返回了此错误:错误:此表达式的类型为'a list,但表达式的类型应为'a类型。类型变量'a出现在'a列表中这意味着什么?我找到了一个连接的解决方案(hanoi_rec(n-1)(河内经济研究中心(n-1)经济研究中心)