Подтвердить что ты не робот

Удаление последнего элемента списка (схемы)

Поэтому мне нужно удалить последний элемент списка в схеме.

Например, скажем, у меня есть список (1 2 3 4). Мне нужно вернуться:

(1 2 3)

Моя идея:

reverse(list)
car(list)
reverse(list)

Есть ли функция reverse в схеме (racket)?

4b9b3361

Ответ 1

Вы писали: "Обратный, автомобиль, реверс". Я полагаю, вы хотели написать "reverse, cdr, reverse". Нет ничего плохого в этом решении; он линейный по размеру списка, как и любое решение, использующее стандартные списки.

Как код:

;; 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))

Ответ 2

Существует reverse, но использование его будет не очень эффективным. Я предлагаю следующую рекурсивную функцию.

(define (remove-last lst)
    (if (null? (cdr lst))
        '()
        (cons (car lst) (remove-last (cdr lst)))))

(remove-last '(1 2 3 4)) ; returns '(1 2 3)

if проверяет, находится ли он в последнем элементе списка.

Ответ 3

SRFI 1 (активировать в Racket с помощью (require srfi/1)) имеет функцию drop-right:

 (drop-right '(1 2 3 4) 1)   ; => (1 2 3)

Ответ 4

Я бы сделал рекурсивную функцию, которая идет вниз по списку и присоединяет элемент (используя cons), если элемент после него не является последним и ничего не добавляет, если это не так.

Я не делал схему в течение многих лет, но так, насколько я могу идти.

Кто-то может запускать с тем, как его реализовать (если это не домашнее задание, то они, вероятно, не должны!)

Ответ 5

Я бы написал простую рекурсию, изменив базовый случай типичного "пустого? mylist" на "empty?" (rest mylist) ", чтобы я мог возвращать пустой, когда список входных данных - только 1 элемент.

(define (removelast mylist)
  (cond
    [(empty? (rest mylist)) empty]
    [(cons? mylist) (cons (first mylist) (removelast (rest mylist)))]))

(removelast (list 1 2 3 4 5))

Кстати, этот код находится в Racket/PLT Scheme, подмножестве Схемы.

Ответ 6

Я сделал что-то более простое, чем: reverse (list), car (list), reverse (list), чтобы получить последний элемент, проверьте:

(define (last-one liste)
  (if(null? (cdr liste))
     null
     (cons (car liste) (last-one (cdr liste)))
  )
)