2015-05-08 2 views
-1

Почему мы используем tailr и headr? Я не могу понять.Что делает этот код схемы?

(define (foo lst) 
    (cond 
    ((not (list? lst)) lst) 
    ((null? lst) lst) 
    (else (let* ((tail (cdr lst)) 
       (head (car lst)) 
       (tailr (foo tail)) 
       (headr (foo head))) 
      (append tailr (list headr)))))) 
+1

хвост, голова, tailr и headr только промежуточные переменные. Весь блок let * можно записать как '(append (foo (cdr lst)) (list (foo (car lst)))). –

+2

Это вопрос о домашней задаче или экзамене? Это время года, и, хотя я не вижу его в Интернете, я вижу, что кто-то также ввел код в ideone на http://ideone.com/fork/hqywYX; где они смогут * видеть * то, что он на самом деле делает, запустив его. –

+0

Просто запустите его ... он рекурсивно реверсирует список (и также работает для вложенных списков). 'tailr' и' headr' - это только локальные переменные. –

ответ

-2

Это эквивалентно:

(define (reverse-nested lst) 
    (cond ((not (pair? lst)) lst) 
     (else (reverse (map reverse-nested lst)))))