使用河内塔的名单

时间:2015-04-02 18:09:20

标签: ocaml

我是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移动到

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

1 个答案:

答案 0 :(得分:0)

您当前的代码是必不可少的;即,它按顺序执行一系列动作以创建其输出。

如果你想保持这个命令性角色,你可以使用OCaml不纯的功能。创建一个可变的全局列表(int list ref)。而不是打印结果,将新值添加到列表的开头。然后在结束时,反转列表。

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