Список сумм первых n элементов исходного списка - Lisp

Узнай цену своей работы

Формулировка задачи:

Задача из раздела Haskell Функция формирует список, содержащий суммы элементов первых i элементов исходного списка: Функция summator :: [Integer] -> [Integer] получает список целых и выдает список, содержащий в качестве i-го элемента суммы первых i членов исходного списка. Например, summator [3, 2, 6, 5, 1] => [3, 5, 11, 16, 17].

Решение задачи: «Список сумм первых n элементов исходного списка»

textual
Листинг программы
(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)

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

10   голосов , оценка 3.7 из 5
Похожие ответы