如何在DrRacket中使用家谱创建列表

时间:2019-08-19 23:02:01

标签: scheme racket

我有这个家谱,我想提取一个清单,列出所有蓝眼睛的人的名字。

但我不断获得列表列表:

'((("george") ())
  ("joseph")
  ())



(define-struct node (name birth eyes father mother)) 

(define family (make-node "camille" 2015 "brown"
                           (make-node "mark" 1988 "brown"
                                      (make-node "george" 1963 "blue" empty empty)
                                      (make-node "lisa" 1965 "brown" empty empty))
                           (make-node "jessica" 1990 "black"
                                      (make-node "joseph" 1959 "blue" empty empty)
                                      (make-node "Rebecca" 1964 "black" empty empty))))



(define (col-eyes fam color)
  (cond
    [(empty? fam) empty]
    [(equal? (node-eyes fam) color)
     (cons (node-name fam)
       (append (col-eyes (node-father fam) color)
               (col-eyes (node-mother fam) color)))]
    [else (cons (col-eyes (node-father fam) color)
                (col-eyes (node-mother fam) color))]
    ))

(col-eyes family "blue")

这就是我想要的:'("george" "joseph"),有人可以帮忙吗?谢谢。

1 个答案:

答案 0 :(得分:1)

不确定您使用的是哪种方案,因此我无法对其进行测试,但是您可能希望用append代替最后一个cons

(define (col-eyes fam color)
  (cond
    [(empty? fam) empty]
    [(equal? (node-eyes fam) color)
     (cons (node-name fam)
       (append (col-eyes (node-father fam) color)
               (col-eyes (node-mother fam) color)))]
; right here v
    [else (append (col-eyes (node-father fam) color)
                  (col-eyes (node-mother fam) color))]))
相关问题