Задачка на рекурсию - Lisp
Формулировка задачи:
Решение задачи: «Задачка на рекурсию»
(defun f (i n) (cond ((= n 1) 0) (t (+ (- (^ i n) i) (f i (- n 1)))))) (defun s (n &optional (a 0) (i 1)) (cond ((= i n) a) (t (s n (+ a (f (+ i 1) n)) (+ i 1))))) ;; Тестовые функции (defun chk-f (i n) (iter (for j from 1 to n) (summing (- (^ i j) i)))) (defun chk-s (n) (iter (for i from 1 to n) (summing (iter (for j from 1 to n) (summing (- (^ i j) i)))))) ;; Считаем сумму: (s 20) ==> 169632644582122797919937630 (chk-s 20) ==> 169632644582122797919937630
Объяснение кода листинга программы
В коде представлены две функции: f и s. Функция f имеет два аргумента: i и n. Она рекурсивно вычисляет значение выражения (^ i n) (что эквивалентно возведению в степень), используя следующую итеративную формулу: f(i, n) = (if (= n 1) 0 (+ (- (^ i n) i) (f i (- n 1)))) Функция s также имеет два аргумента: n и a. Она рекурсивно вычисляет сумму чисел от 1 до n, используя формулу: s(n, a, i) = (if (= i n) a (s n (+ a (f (+ i 1) n)) (+ i 1))) Также в коде представлены тестовые функции chk-f и chk-s, которые проверяют правильность работы функций f и s соответственно. Функция chk-f вычисляет сумму выражений (- (^ i j) i) для всех чисел от 1 до n. Функция chk-s вычисляет сумму сумм выражений (- (^ i j) i) для всех чисел от 1 до n. В конце кода функция s вызывается с аргументом 20, что вызывает рекурсивный процесс и в итоге вычисляет сумму чисел от 1 до 20. Таким образом, результатом выполнения кода будет число 169632644582122797919937630.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д