【问题标题】:Scheme - Recursion - Need list as output方案 - 递归 - 需要列表作为输出
【发布时间】:2015-12-10 15:49:21
【问题描述】:

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

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

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

【问题讨论】:

    标签: list recursion scheme output


    【解决方案1】:

    这实际上比看起来更棘手。这里试一试,告诉我你是否见过named 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")
    

    【讨论】:

    • 我们作为读者想知道关于命名的 let。我想这会很棒。
    • 嘿,感谢您的帮助,很抱歉我迟到的答复。实际上它确实帮助了我一点,但问题是,在您的解决方案中,您使用了我们不允许使用的命令,因为它们还没有在我们的计划中(例如循环或 cdr);)也许下次我会提到。非常感谢!
    • loop 在这里不是关键字,它是一个内部过程的名称;请参阅我放入 cmets 的链接。如果cdr 不被允许,我会非常感到惊讶。
    猜你喜欢
    • 2011-07-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-18
    • 2023-04-07
    • 2011-07-01
    • 1970-01-01
    相关资源
    最近更新 更多