这是我的代码,这只是一次尝试......
(define-struct cupboard (upperdrawer middledrawer lowerdrawer))
(define-struct room (name furniture))
(define myrooms
(list
(make-room "Kitchen"
(list
(make-cupboard "Salt" "Sugar" "Pepper")
(make-cupboard "Tofu" "Sausage" "Beef")))
(make-room "Bathroom"
(list
(make-cupboard "Toothbrush" "Soap" "Shampoo")))
(make-room "Sleeping room"
(list
(make-cupboard "Red Socks" "Blue Socks" "Yellow Socks")
(make-cupboard "Suits" "Dresses" "Shoes")))))
(define cupboardcontents
(lambda (myrooms)
(cond((room? (first myrooms))
(cupboard? (first myrooms))
(cupboardcontents (rest myrooms))
((cupboard?(first myrooms)) (list
(cupboard-upperdrawer myrooms)
(cupboard-middledrawer myrooms)
(cupboard-lowerdrawer myrooms)))
))))
(cupboardcontents myrooms)
现在的任务是使用递归获取列表作为输出,其中包括橱柜内容。 有人可以帮忙吗?
答案 0 :(得分:1)
这看起来实际上更棘手。这是一个尝试,告诉我你是否已经看到像名为let的概念,然后我可以扩展它:
(define (cupboardcontents elt)
(reverse
(let loop ((elt elt) (res null))
(cond
((null? elt) res)
((room? elt) (loop (room-furniture elt) res))
((cupboard? elt) (list* (cupboard-lowerdrawer elt)
(cupboard-middledrawer elt)
(cupboard-upperdrawer elt)
res))
((list? elt) (loop (cdr elt) (loop (car elt) res)))
(else (error "wot?" elt))))))
测试:
> (cupboardcontents myrooms)
'("Salt" "Sugar" "Pepper" "Tofu" "Sausage" "Beef" "Toothbrush" "Soap" "Shampoo" "Red Socks" "Blue Socks" "Yellow Socks" "Suits" "Dresses" "Shoes")