Схема добавления процедуры - PullRequest
4 голосов
/ 05 декабря 2010

У меня проблемы с добавлением списка в другой список. Ниже мой код. Когда я бегу (добавляю '(1 2)' (3 4)), я получаю "(1 3 2 4).

Я хочу, чтобы вывод был '(1 2 3 4)

(define (append l m)
 (if (null? l) '()
  (cons (car l) (append m (cdr l)))))

Спасибо

Ответы [ 2 ]

12 голосов
/ 05 декабря 2010

Что ж, переключая два списка таким образом (переключая позиции m и l при рекурсивном вызове append), вы получите первый элемент первого списка, за которым следует первый элемент второго списка и т. Д.

Если вы не хотите этого, вы должны оставить l в качестве первого аргумента и m в качестве второго.Таким образом, вы получите:

(define (append l m)
 (if (null? l) '()
  (cons (car l) (append (cdr l) m))))

Конечно, это не работает так, как хотелось бы, потому что теперь вы получаете только первый список, и ничего не добавляется вообще.Что вам нужно сделать, это после того, как первый список полностью добавлен (т. Е. Когда l пуст), вам нужно вернуть второй как хвост, например:

(define (append l m)
 (if (null? l) m
  (cons (car l) (append (cdr l) m))))
0 голосов
/ 18 февраля 2015

Я сталкивался с этим, изучая себя. Ответ @ sepp2k - это прекрасная инструкция, направляющая OP для исправления их кода для получения рекурсивного определения append. Вот альтернативное определение my-append с использованием функции высшего порядка foldr:

(define (myappend xs ys)
  (foldr cons ys xs))
...