Вы должны немного изменить свой подход.Вместо программирования одной фундаментальной процедуры, которая делает все, вы можете реализовать некоторые служебные процедуры.
Для минимаксной процедуры не имеет значения, поступают ли данные в виде дерева или списка.Таким образом, вы можете написать себе процедуру, которая преобразует ваше дерево в список, подобный этому
(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))))
Для дальнейшего чтения Структура и интерпретация компьютерных программ .Это отличная книга для изучения Схема и программирования в целом.