Как рекурсивно перевернуть список, используя только основные операции?
Мне было интересно, как перевернуть список, используя только основные операции, такие как cons, first, rest, empty? И т. Д.
Вспомогательные функции или аккумуляторы не допускаются, и функция принимает только один вход - список.
Мне сказали, что это возможно, хотя я не могу обернуть голову вокруг этого.
Это то, что я до сих пор концептуализировал. Я не знаю, как сформировать рекурсию для остальной части списка.
(defunc rev-list (x)
(if (or (equal (len x) 0) (equal (len x) 1))
x
(cons (first (rev-list (rest x)))
???)))
По-видимому, можно сделать нечто подобное с функцией, которая меняет местами первый и последний из списка, хотя я также не до конца понимаю это. Вот код для этого:
(define swap-ends (x)
(if (or (equal (len x) 0) (equal (len x) 1))
x
(cons (first (swap-ends (rest x)))
(swap-ends (cons (first x)
(rest (swap-ends (rest x))))))))