Перемещение первого элемента перемещено в конец списка - схема - PullRequest
2 голосов
/ 01 ноября 2011

У меня проблемы с написанием функции, которая будет перемещать первый элемент в конец списка каждый раз, когда он вызывается. Я попытался использовать комбинацию реверса и CDR, чтобы отрезать элементы на обоих концах, но не могу понять, как добавить элементы к правильному концу. Любая помощь будет оценена. Спасибо!

Правильные результаты:

(first_to_last '(1 2 3))

(2 3 1)

(от первого к последнему (от первого к последнему) (1 2 3)))

(3 1 2)

1 Ответ

1 голос
/ 01 ноября 2011

Я думаю, что ты слишком много делаешь задним ходом, лично.

Нам нужен список, состоящий из cdr x с добавлением car x в конце. Единственная хитрость в том, что car x не является списком, поэтому мы хотим преобразовать его в список перед добавлением:

(define (first-to-last x) (append (cdr x) (list (car x))))

Если вы хотите придерживаться основ, cons - это действительно фундаментальный способ объединения вещей в списки, но это будет немного больше работы. В итоге вы бы определили что-то, по существу идентичное append в терминах cons Это довольно просто, но бессмысленно, учитывая, что append уже существует.

Редактировать: Я думаю, если вы хотите использовать reverse по тем или иным причинам, вы можете сделать что-то вроде этого:

(define (first-to-last x) (reverse (cons (car x) (reverse (cdr x)))))

Это немного длиннее и кажется мне неуклюжим, но все равно должно сработать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...