我正在尝试编写一个 Common Lisp 函数,该函数将给出列表的所有可能排列,每个元素仅使用一次。例如,列表 '(1 2 3) 将给出输出 ((1 2 3) (1 3 2) (2 1 3) (2 3 1) (3 1 2) (3 2 1))。
我已经写过一些有用的东西,但它很笨拙,并不总是有效,而且我什至不太理解它。我并不是要求代码,只是寻求一些关于如何思考它的指导。我对编写算法不太了解。
谢谢,
贾森
作为基本方法,“所有排列”遵循以下递归模式:
all permutations of a list L is:
for each element E in L:
that element prepended to all permutations of [ L with E removed ]
如果我们认为列表中没有重复元素,则应执行以下操作:
(defun all-permutations (list)
(cond ((null list) nil)
((null (cdr list)) (list list))
(t (loop for element in list
append (mapcar (lambda (l) (cons element l))
(all-permutations (remove element list)))))))
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)