Задачка на рекурсию - Lisp

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

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

Всем доброго времени суток! Нужна помощь в написании функции на рекурсию. Нужно подсчитать Пробовала написать функцию хотя бы просто для возведения числа в степень - не работает.

Решение задачи: «Задачка на рекурсию»

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

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


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

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

10   голосов , оценка 4.1 из 5