Есть небольшая ошибка, когда n
больше, чем длина списка, вы должны вернуть весь список (или сообщить об ошибке), я исправил это.Вот пример кода:
(define (last-n lst n)
(define (help-func lst drop)
(cond
; iterate while there are elements to drop
((> drop 0)
; advance on the list, and we're one
; element closer to reach our target
(help-func (cdr lst) (- drop 1)))
(else
; else we reached the point we wanted, stop
(cdr lst))))
; if n is at least as big as the list
(if (>= n (length lst))
; return the whole list
lst
; else calculate how many elements
; we need to drop and start the loop
(help-func lst (- (length lst) 1 n))))
К вашему сведению, Racket уже имеет эту функцию, просто используйте встроенную процедуру take-right
, это будет даже быстрее, требуя одного прохода черезlist (вы звоните length
пару раз и по умному алгоритму, который был бы ненужен)