在汉诺塔中使用列表
Using lists in Tower of Hanoi
我是 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]
”。我该怎么做?
您当前的代码是命令式的;即,它按顺序执行一系列操作以创建其输出。
如果你想保持这种命令式的特性,你可以使用 OCaml 的不纯特性。创建一个可变的全局列表(int list ref
)。不打印结果,而是将新值添加到列表的开头。然后在最后,反转列表。
另一方面,学习 OCaml 的主要原因之一是学习函数式编程。您可以在不使用全局值或可变值的情况下解决问题。我怀疑一般的方法是 hanoi_rec
return 一个移动列表。这是我会推荐的,因为我相信功能性思考应该在每个程序员的工具包中。
我是 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]
”。我该怎么做?
您当前的代码是命令式的;即,它按顺序执行一系列操作以创建其输出。
如果你想保持这种命令式的特性,你可以使用 OCaml 的不纯特性。创建一个可变的全局列表(int list ref
)。不打印结果,而是将新值添加到列表的开头。然后在最后,反转列表。
另一方面,学习 OCaml 的主要原因之一是学习函数式编程。您可以在不使用全局值或可变值的情况下解决问题。我怀疑一般的方法是 hanoi_rec
return 一个移动列表。这是我会推荐的,因为我相信功能性思考应该在每个程序员的工具包中。