我试着写一个函数来分析游戏树。树由嵌套列表表示,每个子列表代表一个分支。基本上,有两件事我想弄清楚:
我以为我已经解决了第一个问题,但是我的代码总是返回错误的值--我已经检查了所有的东西,看不出我做错了什么。
任何帮助都将不胜感激,谢谢!
;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")))))发布于 2014-02-12 18:42:31
你应该改变一下你的方法。您可以实现一些实用过程,而不是编写一个基本的过程来实现所有的东西。
对于minimax过程来说,数据是出现在树中还是列表中并不重要。因此,您可以自己编写一个过程,将树转换为如下列表。
(define (fringe t)
(cond ((null? t) t)
((pair? (car t)) (append (fringe (car t))
(fringe (cdr t))))
(else (cons (car t) (fringe (cdr t))))))检查最小值或最大值基本上是对列表或树的迭代。所以你可以用fold来做这件事。请参阅http://www.gnu.org/software/mit-scheme/documentation/mit-scheme-ref/Reduction-of-Lists.html
所以你可以这样写你的程序:
(define (minimax op t)
(let ((flat-list (fringe t)))
(fold op (car t) (cdr t))))欲进一步阅读计算机程序的结构与解释。这是一本很好的书,学习方案,和一般编程。
https://stackoverflow.com/questions/5227473
复制相似问题