2016-03-28 1 views
-2

Я знаю, как получить первые n элементы в списке,Получить последние п элементов в списке в DrRacket, без списка-реф

(define (countup n ls) 
    (cond 
    [(zero? n) '()] 
    [else (cons (first ls) (countup (sub1 n) (rest ls)))])) 

, но как я могу сделать что-то подобное для последнегоn элементы в списке (без использования списка-ref)?

Если я позвоню (countup 3 '(a b c d e)), я получаю (list a b c). Мне нужно иметь возможность ввести (counter 3 '(a b c d e)) и получить (list c d e).

Мне нужны сообщения об ошибках в случае, если число n указано больше, чем длина списка.

ответ

2

Просто используйте встроенный take-right процедуры, он делает именно то, что вам нужно:

(take-right '(a b c d e) 3) 
=> '(c d e) 

Или вы можете реализовать его с нуля, используя примитивные процедуры:

(define (counter n lst) 
    (define (move n lst) 
    (if (zero? n) 
     lst 
     (move (sub1 n) (rest lst)))) 
    (define (trim-left lst rst) 
    (if (empty? rst) 
     lst 
     (trim-left (rest lst) (rest rst)))) 
    (trim-left lst (move n lst))) 

Он также работает как ожидается:

(counter 3 '(a b c d e)) 
=> '(c d e) 
+0

Мне нужно уметь это сделать без использования правильного выбора – KrissyMichaelsson

+0

altho I благодарю вас за помощь, я не могу использовать trim, take, move или list-ref. – KrissyMichaelsson

+0

Я не использую ни один из них, я просто определил две вспомогательные процедуры, которые называются 'move' и' trim-left'. Можно использовать дополнительные помощники, вы не можете легко решить эту проблему без них. –

Смежные вопросы