Поэтому мне нужно удалить последний элемент списка в схеме.
Например, скажем, у меня есть список (1 2 3 4)
. Мне нужно вернуться:
(1 2 3)
Моя идея:
reverse(list)
car(list)
reverse(list)
Есть ли функция reverse
в схеме (racket)?
Поэтому мне нужно удалить последний элемент списка в схеме.
Например, скажем, у меня есть список (1 2 3 4)
. Мне нужно вернуться:
(1 2 3)
Моя идея:
reverse(list)
car(list)
reverse(list)
Есть ли функция reverse
в схеме (racket)?
Вы писали: "Обратный, автомобиль, реверс". Я полагаю, вы хотели написать "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))
Существует 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
проверяет, находится ли он в последнем элементе списка.
SRFI 1 (активировать в Racket с помощью (require srfi/1)
) имеет функцию drop-right
:
(drop-right '(1 2 3 4) 1) ; => (1 2 3)
Я бы сделал рекурсивную функцию, которая идет вниз по списку и присоединяет элемент (используя cons
), если элемент после него не является последним и ничего не добавляет, если это не так.
Я не делал схему в течение многих лет, но так, насколько я могу идти.
Кто-то может запускать с тем, как его реализовать (если это не домашнее задание, то они, вероятно, не должны!)
Я бы написал простую рекурсию, изменив базовый случай типичного "пустого? 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, подмножестве Схемы.
Я сделал что-то более простое, чем: reverse (list), car (list), reverse (list), чтобы получить последний элемент, проверьте:
(define (last-one liste)
(if(null? (cdr liste))
null
(cons (car liste) (last-one (cdr liste)))
)
)