как определить последний в схеме? - PullRequest
2 голосов
/ 17 февраля 2010

как я могу написать функцию, чтобы взять последний элемент списка?

Ответы [ 8 ]

5 голосов
/ 17 февраля 2010

найти последний из списка:

(define (last l)
    (cond ((null? (cdr l)) (car l))
          (else (last (cdr l)))))

используйте карту для отображения последнего списка:

(map last '((a b) (c d) (e f)))
==> (b d f)

новая функция:

(define (last-list l)
  (map last l)
  )

(last-list '((a b) (c d) (e f)))
==> (b d f)
4 голосов
/ 17 февраля 2010

Может быть не самым эффективным, но, безусловно, одним из самых простых:

(define (last lst)
  (car (reverse lst)))

Примеры:

(last '(1 2 3 4)) => 4    
(last '((a b) (b c) (d e))) => (d e)
3 голосов
/ 17 февраля 2010

Код, который вы написали - чтобы взять последний элемент списка - это правильно , возвращающий последний элемент списка. У вас есть список списков. Есть внешний список

(x y z)

, где

x = (a b)
y = (c d)
z = (e f)

Итак, вы получаете последний элемент списка, z, который (e f)

Вы хотели, чтобы ваша последняя функция выполняла что-то другое? Если вы хотите, чтобы он возвращал последний элемент последнего вложенного списка, вам нужно изменить базовый вариант. Прямо сейчас вы возвращаете машину. Вместо этого вы хотите проверить, является ли автомобиль списком, а затем вызвать на нем вашу функцию «Вложенный последний».

Имеет смысл?

1 голос
/ 17 февраля 2010

Еще одна возможность:

(define (last thelist) 
    (if 
        (null? (cdr thelist)) (car thelist)
        (last (cdr thelist))))

(define (all-last lists) (map last lists))

Изменить: только что увидел, что вы не знаете map и хотите решение без него:

(define (all-last lists) 
    (if
        (null? lists) `()
        (cons (last (car lists)) (all-last (cdr lists)))))

Что касается получения пустого списка, я предполагаю, что вы пытаетесь использовать этот интерфейс, похожий на карту, с вашим исходным определением last, тогда как он предназначен для работы с определением last Я дал выше. Попробуйте следующие определения:

(define (last thelist) (if 
                 (null? (cdr thelist)) (car thelist)
                 (last (cdr thelist))))

(define (all-last lists) (if
                      (null? lists) `()
                      (cons (last (car lists)) (all-last (cdr lists)))))

и запуск быстрого теста:

(все последние `((a b) (c d) (e f)))

Результат должен быть:

(б д ф)

1 голос
/ 17 февраля 2010

Ваша последняя функция хороша, но вы должны подумать о том, что вы хотите с ней сделать сейчас.

У вас есть список списков, и вы хотите взять последний из всех.

Так что запишите свой список, применяя его каждый раз:

(define (answer lst)
   (cond ((null? (cdr l)) null)
         (else (cons (last (car l)) (answer (cdr lst))))
0 голосов
/ 23 февраля 2013

Лучший способ получить то, что вы хотите:

(define (last lst)
  (cond [(empty? lst) empty]
        [(empty? (rest lst)) (first lst)]
        [else (last (rest lst))]))
0 голосов
/ 05 марта 2011

Мне нравятся короткие, сладкие, быстрые, хвостово-рекурсивные процедуры.

По имени пусть мой друг.

Это решает исходную проблему и возвращает #f, если в списке нет последнего элемента.

(определить (последний L) (пусть f ((последний #f) (L L)) (если (пустой? L) последний (f (автомобиль L) (cdr L)))))

0 голосов
/ 20 февраля 2010
(define last
  (lambda (ls)
    (list-ref ls (- (length ls) 1))))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...