2015-11-13 6 views
2

Я пытаюсь изменить список на схеме с помощью DrRacket.Схема обратного списка

Код:

(define rev 
    (lambda(l) 
    (if (null? l) 
     '() 
     (append (rev (cdr l)) (list (car l)))))) 

Если я вход (rev '(a((b)(c d)(((e)))))), выход (((b) (c d) (((e)))) a).

Я хочу, чтобы это было (((((e)))(d c)(b))a). Я смотрел здесь: How to Reverse a List?, но я получаю еще худший результат. Что я делаю не так? Любая помощь будет оценена!

ответ

1

Это сложнее, чем кажется, что вы пытаетесь сделать «глубокий реверс» в списке списков, а не только элементы поменялись местами, но и структура ... здесь, попробуйте следующее:

(define (rev l) 
    (let loop ((lst l) 
      (acc '())) 
    (cond ((null? lst) acc) 
      ((not (pair? lst)) lst) 
      (else (loop (cdr lst) 
         (cons (rev (car lst)) 
          acc)))))) 

Работает так, как ожидалось:

(rev '(a ((b) (c d) (((e)))))) 
=> '(((((e))) (d c) (b)) a) 
+0

Большое спасибо! Никогда не знал о командах 'let',' loop' и 'acc'. ** РЕДАКТИРОВАТЬ **: Не могли бы вы узнать эквиваленты этих команд с помощью 'lambda'? Профессор не мог позволить мне использовать «цикл» или «acc». Если нет, все в порядке. –

+0

Ничего! Я посмотрел, как работает, и это имеет смысл. Еще раз спасибо! –

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