【发布时间】:2014-06-02 14:03:07
【问题描述】:
我想得到一棵树的最大值
我有这个:
define (dato-tree nodo)
(first nodo))
(define (left-tree nodo)
(first (rest nodo)))
(define (right-tree nodo)
(first (rest (rest nodo))))
(define maximum
(lambda (arbol)
(if (eqv? (right-tree arbol) #f)
arbol
(maximum (right-tree arbol)))))
并运行它:
(define tree (list 5 (list 2 (list 1 empty empty) empty) (list 7 empty empty)))
(maximum tree)
给我这个错误:
rest: expects a non-empty list; given: empty
怎么可能?
【问题讨论】:
-
你在 Dr.Racket 中运行这个吗?通常当出现错误时,它会在代码中突出显示错误发生的位置。在这种情况下,很明显它使用了
rest,你在三个地方都有。您应该能够跟踪程序的执行并查看可以调用(rest empty)的位置。 -
另外,您的程序中有一个检查
(eqv? (right-tree arbol) #f),但您的树中没有#f。您预计该测试何时会成功?如果它永远不会成功,那么你继续调用(maximum (right-tree arbol)),但树不能永远继续下去。不难看出你为什么最终会打电话给(rest empty),是吗? -
是的,我明白树的最大值会怎样?
-
我认为数据结构教科书或课程可能会回答这类问题。不用担心它的实现方面,如果一棵树包含三个部分(元素、左子树和右子树),那么如何定义整个树的最大元素? treeMax(tree(element,left,right)) = max(element,treeMax(left),treeMax(right)).