scheme计算二叉树的根

时间:2014-02-07 03:44:23

标签: scheme binary-search-tree

所以我试图编写一个函数来计算方案中二叉树的根。根通过以下标准计算:根处的值是其两个子项的值的最大值,其中每个值都是其两个子项的最小值等。在最大化子项和最小化子项之间交替。

因此(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)))))

但是我的代码没有返回正确的数字。我哪里可能出错?

2 个答案:

答案 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))))

不知道这是否能解决您的具体问题,但至少您可以信任计算出的值。