Вы писали: «задний ход, машина, задний ход».Я полагаю, вы хотели написать «реверс, cdr, реверс».В этом решении нет ничего плохого;он линейный по размеру списка, как и любое решение, использующее стандартные списки.
Как код:
;; all-but-last: return the list, not including the last element
;; list? -> list?
(define (all-but-last l) (reverse (cdr (reverse l))))
Если вас беспокоит многократный обход списка или создание ненужной копии другого списка, вы, безусловно, можете избежать этого, написав эту вещь напрямую.*
Учитывая ваше почти решение, я собираюсь предположить, что это не домашняя работа.
Вот как это будет выглядеть в ракетке:
#lang racket
(require rackunit)
;; all-but-last : return the list, except for the last element
;; non-empty-list? -> list?
(define (all-but-last l)
(cond [(empty? l) (error 'all-but-last "empty list")]
[(empty? (rest l)) empty]
[else (cons (first l) (all-but-last (rest l)))]))
(check-equal? (all-but-last '(3 4 5))
'(3 4))