我正在学习 Scheme,作为一个玩具示例,我正在为 Hanoi Towers 做一个解决方案验证器(不是求解器)。我想使用纯粹的功能风格(只是为了进入心态),我将塔表示为三个列表的简单列表。起始状态可能如下所示:'((0 1 2 3 4) () ())
我将如何实现一个接受状态、源索引和目标索引并返回新状态的函数?在命令式风格中,这将是微不足道的,例如:
state[target].push(state[source].pop())
但是我能想到的每一个功能性解决方案都非常复杂。例如:
(define (makeMove state source target)
(letrec ((recMake (lambda(tower pos disc)
(if (null? tower) '()
(cons (if (eqv? pos source)
(cdr (car tower))
(if (eqv? pos target)
(cons disc (car tower))
(car tower)))
(recMake (cdr tower)
(+ pos 1)
disc))))))
(recMake state 0 (car (list-ref state source)))))
这似乎可行,但必须有更好的方法。我想地图会比递归好一些,但还是太多了。如果我以不同的方式表示状态会更容易吗?
另外,请随时批评我的代码。我真的不知道我在做什么。
编辑:如果可能的话,我希望你不要假设塔的数量总是 3。