Как поменять первые два элемента списка в ракетке? - PullRequest
0 голосов
/ 08 ноября 2019

Я пытаюсь написать функцию, которая принимает список и возвращает тот же список с заменой первых двух элементов, например, с учетом '(abcdef) он должен вернуть' (bacdef), мне удалось вернуть первые два замененных элементаоднако он помещает остальные элементы в список '(ba (cdef)), также есть простой способ сделать это, кроме того, как я это сделал.

(define swap-two (λ (l)
                   (cond
                     ((empty? l) 0)
                     ((< (length l) 2) "less than two")
                     ((>= (length l) 2) (append (list (cadr l) (car l) (cddr l))))
                     (#t l))))

1 Ответ

1 голос
/ 08 ноября 2019

Мы можем упростить решение, для начала вам не нужно так много случаев, либо в списке>> 2 элемента, либо нет.

В Racket мы можем использовать интуитивно названное first иsecond процедуры получения первого и второго элементов в списке, а элементы после этого можно получить с помощью не столь интуитивно понятной процедуры cddr.

Последний шаг - просто consвсе вместе, чтобы составить правильный список. Вы использовали (append (list ...)), поэтому последняя часть появилась внутри списка. Лучше потратить некоторое время на ознакомление с тем, как работают cons, list и append. Вот что я имею в виду:

(define swap-two
  (λ (lst)
    (if (< (length lst) 2)
        "less than two"
        (cons (second lst)
              (cons (first lst)
                    (cddr lst))))))

Работает как положено:

(swap-two '(a b c d e f))
=> '(b a c d e f)
...