Для множества атомов M={e1,e2,…,en} cгенерировать все списки состоящие из k элементов (k<=n) - Lisp

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

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

Для множества атомов M={e1,e2,…,en} cгенерировать все списки состоящие из k элементов (k<=n). Заранее спасибо

Решение задачи: «Для множества атомов M={e1,e2,…,en} cгенерировать все списки состоящие из k элементов (k<=n)»

textual
Листинг программы
(defun next-l (lst n k) ;; следующая выборка
  (cond ((null lst) nil)
        ((< (car lst) (- n 1)) (cons (+ 1 (car lst)) (cdr lst)))
        (t (cons (% (+ (car lst) 1) n) (next-l (cdr lst) n k)))))
 
(defun task (lst k)
  (let ((n (length lst))
        (r (list (replicate 0 k))))
    (iter (for i from 1 to (- (^ n k) 1)) (push (next-l (car r) n k) r))
    (iter (for a in r) (collecting (mapcar (lambda (x) (nth x lst)) a)))))
 
==> TASK
 
(task '(a b c d) 1)
 
==> ((D) (C) (B) (A))
 
(task '(a b c d) 2)
 
==> ((D D) (C D) (B D) (A D) (D C) (C C) (B C) (A C) (D B) (C B) (B B) (A B) (D A) (C A) (B A) (A A))
 
(task '(a b c d) 3)
 
==> ((D D D) (C D D) (B D D) (A D D) (D C D) (C C D) (B C D) (A C D) (D B D) (C B D) (B B D) (A B D) (D A D) (C A D) (B A D) (A A D) (D D C) (C D C) (B D C) (A D C) (D C C) (C C C) (B C C) (A C C) (D B C) (C B C) (B B C) (A B C) (D A C) (C A C) (B A C) (A A C) (D D B) (C D B) (B D B) (A D B) (D C B) (C C B) (B C B) (A C B) (D B B) (C B B) (B B B) (A B B) (D A B) (C A B) (B A B) (A A B) (D D A) (C D A) (B D A) (A D A) (D C A) (C C A) (B C A) (A C A) (D B A) (C B A) (B B A) (A B A) (D A A) (C A A) (B A A) (A A A))

Объяснение кода листинга программы

Код решает задачу генерации всех возможных списков из заданного множества атомов. Основной функцией является next-l, которая принимает три аргумента: список lst, число n и число k. Если lst пустой, то возвращается nil. В противном случае, функция проверяет, меньше ли car lst n-1, и если да, то добавляет к car lst единицу и передает результат вместе с cdr lst в следующую итерацию next-l. Если car lst больше или равен n-1, то вызывается функция next-l для cdr lst, n и k. Функция task принимает два аргумента: список lst и число k. Сначала определяется длина списка lst и создается пустой список r для хранения результатов. Затем происходит итерация по всем возможным значениям от 1 до n-1. На каждой итерации вызывается next-l с соответствующим аргументом, и результат добавляется в конец списка r. В конце функции происходит еще одна итерация, в которой каждый элемент списка r преобразуется в список, содержащий k элементов из исходного списка lst. Результатом работы функции task является список списков, которые были сгенерированы. Например, при вызове (task '(a b c d) 1), функция вернет список, содержащий все возможные варианты выбора одного элемента из списка lst=(a b c d). При вызове (task '(a b c d) 2), функция вернет список, содержащий все возможные варианты выбора двух элементов из списка lst. И так далее.

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


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

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

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