对于我的HW,使用这些结构:
(define-struct Plus (tl tr))
(define-struct Neg (t))
(define-struct Times (tl tr))
我必须解决以下问题:
height:num-tree - > num,用于计算树的最长分支中的节点数。
和
unparse:num-tree - >用于构造与给定树匹配的Racket表达式的字符串。
以下各项的示例如下:
(height (make-Plus (make-Neg (make-Times 3 4)) (make-Neg 6)))
=> 4
和
(unparse (make-Plus (make-Neg (make-Times 3 4)) (make-Neg 6)))
=> "(+ (- (* 3 4)) (- 6))"
我对身高问题的疑问是如何检查哪一个是给定树的最长边?当我有一个带有两个参数的结构(比如说Times)时,如何检查哪一个具有更长的分支?之前的问题让我们解决了树的大小问题,但问题是,树的大小很容易解决,因为你只需要对所有条件执行+1,直到达到基本情况为止。高度不同,因为您不想计算树的左侧和右侧的节点,而只计算具有最大高度的节点。
对于unsarse,我们还必须做一个让我们评估数字树的问题。但是,我不知道如何解决这个问题,因为你无法真正使用我为了解决这个问题而做出的评估函数。
有任何解决这个问题的建议吗?
答案 0 :(得分:1)
对于程序height
,如果结构有2个字段,则只需使用max
:
(define (height tree)
(cond
((Plus? tree) (add1 (max (height (Plus-tl tree)) (height (Plus-tr tree)))))
((Times? tree) (add1 (max (height (Times-tl tree)) (height (Times-tr tree)))))
((Neg? tree) (add1 (height (Neg-t tree))))
(else 1)))
对于unparse
,只需要连接字符串,无需进行评估:
(define (unparse tree)
(cond
((Plus? tree) (format "(+ ~a ~a)" (unparse (Plus-tl tree)) (unparse (Plus-tr tree))))
((Times? tree) (format "(* ~a ~a)" (unparse (Times-tl tree)) (unparse (Times-tr tree))))
((Neg? tree) (format "(- ~a)" (unparse (Neg-t tree))))
(else (format "~a" tree))))
测试:
(define x (make-Plus (make-Neg (make-Times 3 4)) (make-Neg 6)))
(height x)
=> 4
(unparse x)
=> "(+ (- (* 3 4)) (- 6))"