(通用Lisp)
(defparameter all'(((1 1)));每对的第一个元素表示总路径长度,第二个元素表示该大小的树中有多少个具有相同路径长度
(拆下组合副本(列表1);获取一个配对列表,通过将第一个编号相同的配对与第二个编号相加,将其合并
(出租*
((列表(排序列表1#'(λ(a b)(<(第一个a)(第一个b))))
(位置列表)
(循环
(when(null(cdr位置))(return))
(如果(=(第一个(汽车位置))
(项目
(incf(第二个(汽车位置))
(setf(cdr位置)(cddr位置))
(setf位置(cdr位置))
列表))
(联合收割机(编号a b);将两棵树的路径长度组合成一棵更大的树,num是两棵树和新根中包含的元素数
(列表(+num(第一个a)(第一个b))
(*(秒a)(秒b)));可能的树的数量是成倍增加的,因为从每个树中选择一个可能性的每种可能的方法都应该计算在内
(defun map-all(函数列表1列表2);这需要一个函数和两个列表,并以所有组合形式从每个列表中为函数提供一个元素
(mapcan#'(λ(b)
(mapcar#'(lambda(a)(函数函数a b))列表1))
列表2))
(defon路径长度(x);计算具有x个节点的树的可能总路径长度列表
(当(<=(长度全部)x);如果我们还没有计算出这个尺寸的解,我们就这样做
(let((num(1+(*2x)));因为我们使用的是全叶树,所以当给定节点数时,我们计算元素的数量
(nconc all(list;我们将此大小的结果粘贴到所有结果列表的末尾
(组合副本
(mapcan;我们尝试了各种方法将x-1个不可区分的节点分为两组
#'(λ(n)(map-all
#'(λ(a b)(合并数值a b));我们通过递归每个分支的所有可能树来获得所有可能树
(路径长度n);所有可能的树与我们的一些节点的路径长度
(路径长度(-x n 1));所有可能树与其余节点的路径长度
(x收集i)));0到x-1的列表
(elt all x));返回此大小的解决方案
(progn(路径长度40)nil);用结果填充“all”,将40更改为这个序列中您想要的任意多个元素(progn…nil是为了不让数字覆盖屏幕)
(defon find-max(seq));找到树数最多的一对
(let((最大值'(0 0)))
(seq do中i的循环
(当(>(秒i)(秒最大值))
(设置f最大值i))
最大值)
(所有集合中a的循环(第一个(find-max a));为您提供每种大小的最大树数的路径长度
|