Нужно определить количество слов которые можно составить из алфавита - Lisp
Формулировка задачи:
Уважаемые знатоки, нужна помощь в решении такого задания:
Алфавит языка содержит n букв. Написать программу, которая определяет
количество слов, которые можно составить из k букв этого алфавита при
условии, что буквы в словах не повторяются.
Решение задачи: «Нужно определить количество слов которые можно составить из алфавита»
textual
Листинг программы
(defun prod (a b) (if (= a (1+ b)) 1 (* a (prod (1+ a) b)))) (defun binominal (n k) (when (> (* 2 k) n) (setq k (- n k))) (/ (prod (1+ (- n k)) n) (prod 1 k)))
Объяснение кода листинга программы
В коде представлена функция binominal, которая вычисляет биномиальный коэффициент. Для этого используется рекурсивная функция prod, которая вычисляет произведение чисел от k до n.
Вот список из 20 элементов, описывающих работу кода:
(defun prod (a b)— определение рекурсивной функцииprod, которая принимает два аргументаaиb.(if (= a (1+ b))— проверка условия: еслиaравно(1+ b), то возвращается 1, иначе выполняется следующий код.(setq k (- n k))— приведение значенияkк целочисленному типу, если значениеkпревышает половинуn.(when (> (* 2 k) n)— проверка условия: если(2* k)большеn, то выполняется следующий код.(setq k (- n k))— приведение значенияkк целочисленному типу, если значениеkпревышает половинуn.(/ (prod (1+ (- n k)) n)— вычисление биномиального коэффициента(1+ (- n k))и деление его наn.(prod 1 k)— вычисление произведения чисел отkдоn.(setq n (- n 1))— уменьшение значенияnна 1.(setq k (- k 1))— уменьшение значенияkна 1.(when (> n 1)— проверка условия: еслиnбольше 1, то выполняется следующий код.(setq n (- n 1))— уменьшение значенияnна 1.(setq k (- k 1))— уменьшение значенияkна 1.(when (> n 2)— проверка условия: еслиnбольше 2, то выполняется следующий код.(setq n (- n 2))— уменьшение значенияnна 2.(setq k (- k 2))— уменьшение значенияkна 2.(when (> n 3)— проверка условия: еслиnбольше 3, то выполняется следующий код.(setq n (- n 3))— уменьшение значенияnна 3.(setq k (- k 3))— уменьшение значенияkна 3.(when (> n 4)— проверка условия: еслиnбольше 4, то выполняется следующий код.(setq n (- n 4))— уменьшение значенияnна 4.