Scheme - 递归 - 需要列表作为输出

时间:2015-12-10 15:49:22

标签: list recursion scheme output

这是我的代码,这只是一次尝试......

(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)

现在的任务是使用递归获取列表作为输出,其中包括橱柜内容。 有人可以帮忙吗?

1 个答案:

答案 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")