История изменений
Исправление monk, (текущая версия) :
Там может быть бесконечный список, или возвращаться хоть и список, но с задублированными значениями.
Это же лисп, а не хаскель. Бесконечных списков не бывает.
Как выглядит функциональная имплементация функции length?
Как всегда, хвостовая рекурсия с аккумулятором результата:
(defun my-length (list)
(labels ((recurse (list result)
(if list (recurse (cdr list) (1+ result)) result)))
(recurse list 0)))
или можно красиво написать
(defun my-length (list)
(reduce #'+ list :key (constantly 1)))
если считать, что уже есть свёртка.
Исправление monk, :
Там может быть бесконечный список, или возвращаться хоть и список, но с задублированными значениями.
Это же лисп, а не хаскель. Бесконечных списков не бывает.
Как выглядит функциональная имплементация функции length?
Как всегда, хвостовая рекурсия с аккумулятором результата:
(defun my-length (list)
(labels ((recurse (list result)
(if list (recurse (cdr list) (1+ result)) result)))
(recurse list 0)))
или можно красиво написать
(defun my-length (list)
(reduce #'+ list #:key (constantly 1)))
если считать, что уже есть свёртка.
Исправление monk, :
Там может быть бесконечный список, или возвращаться хоть и список, но с задублированными значениями.
Это же лисп, а не хаскель. Бесконечных списков не бывает.
Как выглядит функциональная имплементация функции length?
Как всегда, хвостовая рекурсия с аккумулятором результата:
(defun my-length (list)
(labels ((recurse (list result)
(if list (recurse (cdr list) (1+ result)) result)))
(recurse list 0)))
или можно красиво написать
(defun my-length (list)
(reduce #'+ 0 list))
если считать, что уже есть свёртка.
Исходная версия monk, :
Там может быть бесконечный список, или возвращаться хоть и список, но с задублированными значениями.
Это же лисп, а не хаскель. Бесконечных списков не бывает.
Как выглядит функциональная имплементация функции length?
Как всегда, хвостовая рекурсия с аккумулятором результата:
(defun my-length (list)
(labels ((recurse (list result)
(if list (recurse (cdr list) (1+ result)) result)))
(recurse list 0)))
или можно красиво написать
(defun my-length (list)
(fold #'+ 0 list))
если считать, что уже есть свёртка.