【问题标题】:scheme calculate root of binary tree方案计算二叉树的根
【发布时间】:2014-02-07 03:44:23
【问题描述】:

所以我正在尝试编写一个函数来计算方案中二叉树的根。根由以下标准计算:根处的值是其两个子项的最大值,其中每个值是其两个子项的最小值,依此类推。在最大化子项和最小化子项之间交替。

所以(TREEMAX '((3 (2 5)) (7 (2 1))) 将返回 3,因为 5 是 2 和 5 的最大值。3 是 3 和 5 的最小值。2 是 2 和 1 的最大值。2 是 7 和 2 的最小值。最后获取根 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)))))

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

【问题讨论】:

  • 您是否尝试过自己使用笔和纸手动运行它?这是了解正在发生的事情的好方法。

标签: scheme binary-search-tree


【解决方案1】:

如果我正确理解您的描述,应该这样做:

(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

【讨论】:

    【解决方案2】:

    当您应用函数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))))
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多