移动下棋

时间:2012-12-02 06:53:03

标签: functional-programming scheme artificial-intelligence mit-scheme

我有一个移动程序,通过传递一对合法移动到棋盘上的棋子: (cons source dest)so(cons 1 2)从棋盘上的第1个位置取一块并将其移动到位置2.

我正在尝试制作一个应用之前所做的相同动作的程序。我试着做

(移动(反向移动))将传入(减去2 1),从而将棋子移回。

不幸的是,反向不适合成对。我无法将其转换为列表,因为它必须更改大量代码以适应最后的null。

任何人都可以想到什么吗? 顺便说一句,我正在使用麻省理工学院计划。

3 个答案:

答案 0 :(得分:1)

您需要为此实现自己的reverse-pair程序,它可以像这样简单:

(define (reverse-pair p)
  (cons (cdr p) (car p)))

或者这个,有点发烧友但不太可读:

(define (reverse-pair p)
  `(,(cdr p) . ,(car p)))

无论哪种方式都按预期工作:

(reverse-pair '(1 . 2))
=> '(2 . 1)

答案 1 :(得分:0)

如果反向功能对配对不起作用,则编写自己的反向功能。我不记得方案的语法,但我认为你已经有了这方面的工具,因为你基本上需要知道如何读取这对中的两个值(你已经在“移动”功能上做了什么)和然后如何基于该数据构建新的元组。

我不明白为什么你认为这会使事情变得太复杂。至于新函数之外的代码,它看起来与你使用“反向”函数提出的原始版本相同。

答案 2 :(得分:0)

如果你把自己限制在`(a.b)对,那么翻转它们就很容易了。像

这样简单的东西
(define reverse-pair
  (lambda (p)
    (cons (cdr p) (car p))))

会这样做。从你的背景来看,我认为你不会处于你'(1 2 3 4 . 5)所处的位置,需要扭转这一点,所以你应该对上面的那个没问题。