Не могу получить конечный список, который я хочу в процедуре обмена - PullRequest
0 голосов
/ 25 января 2019

В конечном счете, я буду пытаться переопределить алгоритмы сортировки в схеме для связанных списков.Я написал подпроцедуру, которая поможет мне в этом.Цель состоит в том, чтобы просто поменять 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 ]

0 голосов
/ 25 января 2019

Два предложения:

  • Вы действительно хотите написать n cdr вызовов для индексации элемента n th ? Я настоятельно рекомендую использовать целочисленные индексы (если они вам нужны).

  • Ссылка на элементы по индексу в связанном списке (т. Е. «Произвольный доступ») в большинстве случаев не очень эффективна, особенно когда это делается в циклах. Я настоятельно рекомендую использовать векторы или более подходящий алгоритм, который не требует произвольного доступа, e. г. сортировка слиянием.

0 голосов
/ 25 января 2019
   (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)

...