Exercises15.1.2

よし!来た電車の中で思いついた考え方でそれっぽいのが出てきた予感。

条件
・引数にとった親自身が青い目をしていた場合は0
・青い目をした人がいなかった場合はfalseを返す

---------------- family tree----------------------

(define-struct parent (children name date eyes ))

;;youngest Gneneration

(define Gustav (make-parent empty 'Gustav 1998 'black))

(define Fred&Eva (list Gustav))  ;;children of Fred&Eva 

;;Middle Generation

(define Adam (make-parent empty 'Adam 1950'yellow))
(define Dave (make-parent empty 'Dave 1955 'black))
(define Eva (make-parent Fred&Eva 'Eva 1955 'brown))
(define Fred (make-parent Fred&Eva 'Fred 1966 'pink))

(define Carl&Bettina (list Adam Dave Eva))


;; oldest Generation 

(define Carl (make-parent Carl&Bettina 'Carl 1926 'green))
(define Bettina (make-parent Carl&Bettina 'Bettina 1926 'green))

-----------------Exercises-------------------------

(define (blue-eyed-descendant? a-parent)  ;;引数にとった親に青い目をした子供がいるか調べる関数
  (cond
    ((symbol=? (parent-eyes a-parent) 'blue) true)
    (else
     (blue-eyed-children? (parent-children a-parent)))))

(define (blue-eyed-children? aloc)
  (cond
    ((empty? aloc) false)
    (else
     (cond
       ((blue-eyed-descendant? (first aloc)) true)
       (else (blue-eyed-children? (rest aloc)))))))

(define (how-far-removed a-parent)  ;;青い目をした人が何世代目か調べる関数
  (cond
    ((not (blue-eyed-descendant? a-parent)) false)
    ((symbol=? (parent-eyes a-parent) 'blue) 0)
    (else
     (how-far-children? (parent-children a-parent)))))

(define (how-far-children? loc)  ;;子のリストを受け取る
  (cond
    ((empty? loc) 0)
    ((blue-eyed-descendant? (first loc)) (+ 1(how-far-children? (parent-children (first loc)))))
    (else (how-far-children? (rest loc)))))

-----------------test----------------------

(how-far-removed Carl) evaluates to : 2
(how-far-removed Gustav) evaluates to : 0

それっぽい答えは出ているものの本当に正しいかもう少し考えてみないと
あと無駄なことしている可能性も大