Disclaimer: Я почти уверен, что мне удалось испортить что-то действительно простое, возможно, потому что я выискивал это между
"настоящая работа" в ожидании медленной сборки C ++, так что моя голова не
в нужном месте.
При взгляде на
Какой самый эффективный способ создания всех возможных комбинаций зелий Skyrim (PC Game)? У меня было наивное представление, что это будет действительно очень простой рекурсивный фильтр в Лиспе для генерации всех комбинаций размера "n «. Ответ, данный там, на R, элегантен и хорошо показывает язык, но этот метод combn(list,n)
привлек мое внимание. (http://stat.ethz.ch/R-manual/R-patched/library/utils/html/combn.html)
(defun combn (list n)
(cond ((= n 0) nil)
((null list) nil)
((= n 1) (mapcar #'list list))
(t (mapcar #'(lambda (subset) (cons (car list) subset))
(combn (cdr list) (1- n))))))
(combn '(1 2 3 4 5 6 7 8 9) 3)
((1 2 3) (1 2 4) (1 2 5) (1 2 6) (1 2 7) (1 2 8) (1 2 9))
Кроме того, это просто возвращает первый набор комбинаций ... Я не могу точно понять, что не так, точно. Кажется, что дело (= n 1)
работает правильно, но дело t
должно делать что-то по-другому, такое как удаление (1 2)
из списка и повторение?
Итак, моя попытка это исправить стала еще более неприятной:
(defun combn (list n)
(cond ((= n 0) nil) ((= n 1) (mapcar #'list list))
((null list) nil)
(t (cons (mapcar #'(lambda (subset) (cons (car list) subset))
(combn (cdr list) (1- n)))
(combn (cdr list) n)))))
что неправильно в точке (t cons(
... я думаю. Но если cons
неправильный ответ, я не уверен, что правильно ...? (Сокращено до использования 2 для демонстрации результата…)
(combn '(1 2 3 4 5 6 7 8 9) 2)
(((1 2) (1 3) (1 4) (1 5) (1 6) (1 7) (1 8) (1 9))
((2 3) (2 4) (2 5) (2 6) (2 7) (2 8) (2 9))
((3 4) (3 5) (3 6) (3 7) (3 8) (3 9))
((4 5) (4 6) (4 7) (4 8) (4 9))
((5 6) (5 7) (5 8) (5 9))
((6 7) (6 8) (6 9))
((7 8) (7 9))
((8 9))
NIL)
… что кажется правильным, за исключением постороннего вложения и бонуса NIL
в конце. (Я ожидал, что ((null list) nil)
отфильтрует это?)
Что я сделал не так? : - (
(И, кроме того, есть ли стандартная процедура для более эффективной работы?)