2015-12-10 2 views
0

Это мой код, который просто попробовать ...Схема - Рекурсия - список Потребности в выходе

(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

Это на самом деле более сложный, чем кажется. Вот попытка, скажите мне, если вы видели такие понятия, как по имени, пусть, то я могу расширить его:

(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") 
+0

Мы как читатель хочет знать, на имени пусть. Я думаю, это будет потрясающе. – observo

+0

@observo Взгляните на http://www.cs.rpi.edu/courses/fall00/ai/scheme/reference/schintro-v14/schintro_126.html#SEC166 – uselpa

+0

Эй, спасибо за вашу помощь и извините за мою позднюю ответ. На самом деле это помогло мне немного, но проблема заключалась в том, что в вашем решении вы использовали команды, которые нам не позволяли использовать, потому что они еще не были в нашем расписании (например, loop или cdr);) Возможно, в следующий раз я упомянул что. Большое спасибо! – JinX213

Смежные вопросы