所以我试图编写一个函数来计算方案中二叉树的根。根通过以下标准计算:根处的值是其两个子项的值的最大值,其中每个值都是其两个子项的最小值等。在最大化子项和最小化子项之间交替。
因此(TREEMAX '((3 (2 5)) (7 (2 1)))
将返回3,因为5是2和5的最大值.3是3和5的最小值.2是2和1的最大值.2是7和2的最小值。最后获得root 3是3和2的最大值。到目前为止我的代码如下:
(define TREEMAX
(lambda (a)
(cond ((list? (car a)) TREEMIN (car a))
((list? (cdr a)) TREEMIN (cdr a))
((> (car a) (cdr a)) (car a))
(#t (cdr b)))))
(define TREEMIN
(lambda (a)
(cond ((list? (car a)) TREEMAX (car a))
((list? (cdr a)) TREEMAX (cdr a))
((< (car a) (cdr a)) (car a))
(#t (cdr b)))))
但是我的代码没有返回正确的数字。我哪里可能出错?
答案 0 :(得分:0)
如果我理解你的描述,应该这样做:
(define (root lst (res null) (maxmin #t))
(if (null? lst)
(apply (if maxmin max min) res)
(let ((c (car lst)))
(root (cdr lst)
(cons (if (list? c) (root c null (not maxmin)) c) res)
maxmin))))
然后
> (root '((3 (2 5)) (7 (2 1))))
3
> (root '((3 (2 (1 5))) (7 ((2 7) 1))))
2
> (root '(1 2))
2
要了解它是如何工作的,这是一个带有调试printf
的版本:
(define (root lst (res null) (maxmin #t))
(if (null? lst)
(let* ((op (if maxmin max min)) (vl (apply op res)))
(printf "~a ~a = ~a\n" op res vl)
vl)
(let ((c (car lst)))
(root (cdr lst)
(cons (if (list? c) (root c null (not maxmin)) c) res)
maxmin))))
输出,例如:
#<procedure:max> (5 2) = 5
#<procedure:min> (5 3) = 3
#<procedure:max> (1 2) = 2
#<procedure:min> (2 7) = 2
#<procedure:max> (2 3) = 3
答案 1 :(得分:-1)
当你应用car
函数时,你使用(car a)
但是当你应用TREEMAX
函数时,你使用TREEMAX (car a)
?
代码的语法错误;你不幸的是错误没有被标记为语法错误。这是一个修复:
(define TREEMAX
(lambda (a)
(cond ((list? (car a)) (TREEMIN (car a)))
((list? (cdr a)) (TREEMIN (cdr a)))
((> (car a) (cdr a)) (car a))
(else (cdr b))))
不知道这是否能解决您的具体问题,但至少您可以信任计算出的值。