Что происходит в каждой строке этого кода? - PullRequest
0 голосов
/ 02 апреля 2019

Я знаю, что весь код должен возвращать последние n-ые элементы списка, однако я не понимаю процесс, как в каждой строке, что происходит (и почему, если возможно)?

(define (last-n lst n)
  (define (help-func lst drop)
    (cond
      ((> drop 0)
       (help-func (cdr lst ) (- drop 1)))
      (else
       (cdr lst ))))
  (if (= (length lst ) n )
      lst
      (help-func lst (- (length lst ) 1 n ))))

1 Ответ

3 голосов
/ 02 апреля 2019

Есть небольшая ошибка, когда 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 пару раз и по умному алгоритму, который был бы ненужен)

...