Не могу получить конечный список, который я хочу в процедуре обмена
В конечном счете, я буду пытаться переопределить алгоритмы сортировки в схеме для связанных списков. Я написал подпроцедуру, которая поможет мне в этом. Цель состоит в том, чтобы просто поменять 2 элемента, заданных в качестве аргументов "пара1 и пара2", а затем вернуть список.
(define (cons-til lst until)
(cond
((or (null? lst) (eq? (car lst) until)) '())
(else (cons (car lst) (cons-til (cdr lst) until)))))
(define (swap lst pair1 pair2)
(cons (cons (append (cons-til lst (car pair1))
(car pair2)) (car pair1)) (cdr pair2)))
(define my-list '(1 2 3 4 5 6 7))
(swap my-list (cdr (cdr my-list)) (cdr (cdr (cdr my-list))))
Когда код выполняется, он возвращает:
(((1 2 . 4) . 3) 5 6 7)
Как я могу это исправить, чтобы иметь простой список схем. Элемент, похоже, поменялся местами.
2 ответа
Два предложения:
Вы действительно хотите написать н
cdr
призывает индексировать n-й элемент? Я настоятельно рекомендую использовать целочисленные индексы (если они вам нужны).Ссылка на элементы по индексу в связанном списке (т. Е. "Произвольный доступ") не очень эффективна в большинстве случаев, особенно когда это делается в циклах. Я настоятельно рекомендую использовать векторы или более подходящий алгоритм, который не требует произвольного доступа, например сортировка слиянием.
(define (swap2 lst pair1 pair2)
(append (append (append (cons-til lst (car pair1))
(list (car pair2)))
(list (car pair1))) (cdr pair2)))
Этот код, кажется, работает. Я не уверен, что это полностью эффективно или разумное решение проблемы. Ждем других предложений. Возвращаемое значение равно '(1 2 4 3 5 6 7)