明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 1145|回复: 6

[源码] 利用递归求表内元素全排列

[复制链接]
发表于 2019-4-13 20:14 | 显示全部楼层 |阅读模式
利用递归计算全排列源码
递归真的是有意思的东西,循环实现不了的,它能实现
(defun perm(lst / ret res);;;lst--任意表
  (cond ((null lst)nil)
        ((null(cdr lst))lst)
        (t
(foreach x lst
  (setq ret(mapcar '(lambda(e)
                      (if (listp e)
                      (cons x e)
                        (list x e))
                      )(perm(vl-remove x lst))))
  (if (listp ret)
    (setq res (append res ret))
  (setq res (list ret res))
    )

    )))
  )

"觉得好,就打赏"
还没有人打赏,支持一下
发表于 2021-8-28 01:30 | 显示全部楼层
(defun        per (lst)
   (if (cdr lst)
     (apply
       'append
       (mapcar
         '(lambda (x)
            (mapcar '(lambda (y) (cons x y)) (per (vl-remove x lst)))
          )
         lst
       )
     )
     (list lst)
   )
)

评分

参与人数 1明经币 +1 收起 理由
tigcat + 1 很给力!

查看全部评分

回复 支持 1 反对 0

使用道具 举报

发表于 2019-4-13 21:13 | 显示全部楼层
就是速度有点慢,超过了7个元素就不行了
 楼主| 发表于 2019-4-15 09:27 | 显示全部楼层
ssyfeng 发表于 2019-4-13 21:13
就是速度有点慢,超过了7个元素就不行了

应该是lisp性能限制了
发表于 2021-8-27 14:41 | 显示全部楼层
谢谢分享
改了一点点
(defun perm (L)
  (cond
    ((null L) nil)
    ((null (cdr L)) (list L))
    (t
     (apply
       'append
       (mapcar (function (lambda (x)
                           (mapcar (function (lambda (y) (cons x y)))
                                   (perm (vl-remove x L))
                           )
                         )
               )
               L
       )
     )
    )
  )
)
发表于 2022-10-5 12:29 | 显示全部楼层
lanjqka 发表于 2021-8-27 14:41
谢谢分享
改了一点点
(defun perm (L)

(perm '(1 1 3 5 2))少了一个元素
发表于 2022-10-5 12:32 | 显示全部楼层
(perm '(1 1 3 5 2))少了一个元素
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2024-3-28 22:16 , Processed in 0.210122 second(s), 30 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表