Список сумм первых n элементов исходного списка - Lisp
Формулировка задачи:
Решение задачи: «Список сумм первых n элементов исходного списка»
(defn foo1 (l) ( (defn go (l s) (cond (null? l) nil (cons (+ s (car l)) (go (cdr l) (+ s (car l)))))) (go l 0))) (defn foo2 (l) ( (defn go (l s r) (cond (null? l) r (go (cdr l) (+ s (car l)) (cons (+ s (car l)) r)))) (reverse (go l 0 nil)))) (defn foo3 (l) ( (def s 0) (defn f (x a) (begun (set! s (+ s x)) (cons s a))) (reverse (foldl f nil l)))) (def l (cons 3 (cons 2 (cons 6 (cons 5 1))))) (print (str входящий список: l)) (print результаты:) (str foo1: (foo1 l) foo2: (foo2 l) foo3: (foo3 l))
Объяснение кода листинга программы
В этом коде представлены три функции, которые выполняют одно и то же: подсчитывают сумму элементов списка. Разница заключается в том, как они это делают. foo1: Использует рекурсию для обхода списка. Если список пуст, возвращает nil. Если не пуст, то добавляет первый элемент к сумме и вызывает функцию go для оставшейся части списка. foo2: Также использует рекурсию для обхода списка. Если список пуст, возвращает исходную сумму. Если не пуст, то добавляет первый элемент к сумме и вызывает функцию go для оставшейся части списка. foo3: Использует итерацию для обхода списка. Создаёт переменную s, которая инициализируется нулём. Функция f принимает два аргумента: x и a. Если x равно нулю, то a добавляется к сумме и возвращается. Если x не равно нулю, то a добавляется к сумме, значение переменной s обновляется, и возвращается новая сумма. В конце применяется функция reverse для получения обратного списка результатов. Пример использования: Создаётся список l, содержащий 3, 2, 6, 5, 1. Вызывается функция foo3 с этим списком. Результатом будет список, содержащий 15, потому что сумма элементов исходного списка равна 15. (def l (cons 3 (cons 2 (cons 6 (cons 5 1)))))) (print (str входящий список: l)) (print результаты:) (str foo1: (foo1 l) foo2: (foo2 l) foo3: (foo3 l)) Вывод: Входящий список: (3 2 6 5 1) Результаты: foo1: nil foo2: 15 foo3: (15)
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д