【发布时间】:2011-07-10 19:02:00
【问题描述】:
我正在尝试编写一个函数来分析游戏树。树由嵌套列表表示,其中每个子列表代表一个分支。基本上,我想弄清楚两件事:
- 嵌套列表的最小值是多少?
- 该值的索引是多少?
我以为我已经基本解决了第一个问题,但我的代码总是返回错误的值——我已经检查了所有内容,但看不到我做错了什么。
任何帮助将不胜感激,谢谢!
;MINIMAX*
(define minimax*
(lambda (l operation hilo)
(cond
((null? l) hilo)
((equal? operation 'max)
(cond
((null? (cdr l)) (if
(list? (car l))
(minimax* (car l) 'min hilo)
(if
(> (car l) hilo)
(car l)
hilo)))
(else (if
(list? (car l))
(if
(> (minimax* (car l) 'min hilo) hilo)
(minimax* (cdr l) 'max (minimax* (car l) 'min hilo))
(minimax* (cdr l) 'max hilo))
(if
(> (car l) hilo)
(minimax* (cdr l) 'max (car l))
(minimax* (cdr l) 'max hilo))))))
((equal? operation 'min)
(cond
((null? (cdr l)) (if
(list? (car l))
(minimax* (car l) 'max hilo)
(if
(< (car l) hilo)
(car l)
hilo)))
(else (if
(list? (car l))
(if
(< (minimax* (car l) 'max hilo) hilo)
(minimax* (cdr l) 'min (minimax* (car l) 'max hilo))
(minimax* (cdr l) 'min hilo))
(if
(< (car l) hilo)
(minimax* (cdr l) 'min (car l))
(minimax* (cdr l) 'min hilo))))))
(else (error "Invalid operation type, must be 'max or 'min")))))
【问题讨论】:
-
您首先可以做的一件事是简化代码。 Racket 中有
argmin和argmax函数,它们返回列表的最小和最大元素,因此您不需要自己编写这些元素。还有min和max作为函数直接使用。如果您正在执行 minimax 算法而不是 alpha-beta 修剪,您可以使用递归map操作编写一个函数,这将更简单。 -
或采用其他数据结构,如记录。
-
如果您发布一些输入和预期输出值的示例,将会很有帮助。
标签: list search lisp scheme minimax