Tree 找到一个人';二元家谱的s子代(scheme lang)

Tree 找到一个人';二元家谱的s子代(scheme lang),tree,scheme,family-tree,Tree,Scheme,Family Tree,这是一个scheme程序,当输入一个人的名字和树时,可以查找二叉家谱树(该树只有父亲和两个儿子-bst)的后代。我认为这里的主要问题是getsons函数。我应该用什么替换此函数? (定义(getfamt)` (汽车制造商) ) (定义(getson1 FAMT) (cadr FAMT) ) (定义(getson2 FAMT) (法姆特博士) ) (定义(getsons FAMT) (cdr FAMT) ) (定义(空?FAMT) (空?FAMT) ) (定义(nosons?FAMT) (和(空

这是一个scheme程序,当输入一个人的名字和树时,可以查找二叉家谱树(该树只有父亲和两个儿子-bst)的后代。我认为这里的主要问题是getsons函数。我应该用什么替换此函数?

(定义(getfamt)` (汽车制造商) ) (定义(getson1 FAMT) (cadr FAMT) ) (定义(getson2 FAMT) (法姆特博士) ) (定义(getsons FAMT) (cdr FAMT) ) (定义(空?FAMT) (空?FAMT) ) (定义(nosons?FAMT) (和(空的?(getson1 FAMT))(空的?(getson2 FAMT))) ) (定义(getd FAMT) (cond((空?FAMT))) ((nosons?FAMT))) ((空的?(getson1 FAMT))(getson2 FAMT)) ((空的?(getson2 FAMT))(getson1 FAMT)) (其他(getd(getsons FAMT))) ) (定义(主要1人家庭) (cond((空?FAMT)(getd’()) ((平等的人(父亲)(父亲)(父亲)(父亲)(父亲)(父亲)) (其他(主要1人(getsons FAMT))) ) (定义FAMT’(皮尔斯(马克(彼得())(布莱斯())(詹姆斯()))

getd
main1
都不正确。在
getd
中,其中一个子项缺失的情况必须递归调用另一个子项上的
getd
,而
else
情况必须递归调用两个子项上的
getd
,并合并答案。无论如何,解决方案太复杂了,只需要两种情况,要么树是空的,要么树是非空的,整个技巧在于知道如何组合来自两个子树的答案,我选择附加元素来创建输出列表:

; returns a list of all descendants, including node at the root
(define (getd FAMT)
  (cond ((empty? FAMT)
         '())
        (else
         (append (list (getfather FAMT))
                 (getd (getson1 FAMT))
                 (getd (getson2 FAMT))))))
类似地,
main1
一旦找到一个人,就必须合并两个儿子的结果,并且必须不断递归地查看树的两侧并合并其答案,因为我们不知道搜索的人在哪一侧(树似乎没有排序):

最后,您应该使用较大的树进行测试,问题中的示例树并没有涵盖所有可能的情况,例如:

(define FAMT 
  '(Pierce
    (Mark 
     (Peter 
      (Logan () ()) 
      ()) 
     (Blaise 
      () 
      (Kurt () ())))
    (James 
     ()
     ())))

(main1 'Mark FAMT)
=> '(Peter Logan Blaise Kurt)

问题没有具体说明应该如何返回子代。作为子树?作为名单?在我的回答中,我假设是后者,如果这不正确,你只需要改变组合答案的方式,使用你需要的任何东西,而不是
append
,子代应该作为名称列表返回。非常感谢你的帮助。
; finds a person and returns a list with all of
; its descendants, the list excludes the person
(define (main1 person FAMT)
  (cond ((empty? FAMT)
         '())
        ((eq? person (getfather FAMT))
         (append (getd (getson1 FAMT))
                 (getd (getson2 FAMT))))
        (else
         (append (main1 person (getson1 FAMT))
                 (main1 person (getson2 FAMT))))))
(define FAMT 
  '(Pierce
    (Mark 
     (Peter 
      (Logan () ()) 
      ()) 
     (Blaise 
      () 
      (Kurt () ())))
    (James 
     ()
     ())))

(main1 'Mark FAMT)
=> '(Peter Logan Blaise Kurt)