明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 1022|回复: 5

[提问] 点集排列组合问题

[复制链接]
发表于 2024-3-17 13:28:37 | 显示全部楼层 |阅读模式
本帖最后由 87282374 于 2024-3-17 13:32 编辑

某个组合进行全排列,把集合中元素的所有按照一定的顺序排列起来,使用P(n, n) = n!表示n个元素全排列的个数。
例如:{1, 2, 3}的全排列为:123;132;213;231;312;321;共6个,即3!=3*2*1=6。
首先取一个元素,例如取出了1,那么就还剩下{2, 3}。
然后再从剩下的集合中取出一个元素,例如取出2,那么还剩下{3}。
以此类推,把所有可能的情况取一遍,就是全排列了,如图:
将数组看为一个集合,将集合分为两部分:0~s和s~e,其中0~s表示已经选出来的元素,而s~e表示还没有选择的元素。
perm(set, s, e)
{
    顺序从s~e中选出一个元素与s交换(即选出一个元素)
    调用perm(set, s + 1, e)
    直到s>e,即剩余集合已经为空了,输出set
}
请路过的高手指点一下!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

x
发表于 2024-3-17 16:55:18 | 显示全部楼层
本帖最后由 kucha007 于 2024-3-17 16:57 编辑


类似这样?我猜你需要的是K:Perm4Lst 排列
  1. ;获取所有元素只出现一次的表@Kucha
  2. (defun K:NoSameLst (Lst / TmpLst)
  3.   (while Lst
  4.     (if (not (member (car Lst) TmpLst))
  5.         (setq TmpLst (append TmpLst (list (car Lst))))
  6.     )
  7.     (setq Lst (vl-remove (car Lst) Lst))
  8.   )
  9.   TmpLst
  10. )
  11. ;从TgtLst取Num个元素进行排列@Kucha
  12. (defun K:Perm4Lst (TgtLst Num)
  13.   (if (setq TgtLst (K:NoSameLst TgtLst))
  14.       (cond
  15.         ((= Num 1)(mapcar '(lambda (x) (list x)) TgtLst))
  16.         ((> Num (length TgtLst)) (list TgtLst))
  17.         ((and (> Num 1) (<= Num (length TgtLst)))
  18.             (apply
  19.               'append
  20.               (mapcar
  21.                 '(lambda (x)
  22.                   (mapcar
  23.                     '(lambda (y) (cons x y))
  24.                     (K:Perm4Lst (vl-remove x TgtLst) (- Num 1))
  25.                   )
  26.                 )
  27.                 TgtLst
  28.               )
  29.             )
  30.         )  
  31.       )
  32.   )
  33. )
  34. ;从TgtLst取Num个元素进行组合@Kucha
  35. (defun K:Comb4Lst (TgtLst Num)
  36.   (if (setq TgtLst (K:NoSameLst TgtLst))
  37.       (cond
  38.         ((= Num 1)(mapcar '(lambda (x) (list x)) TgtLst))
  39.         ((> Num (length TgtLst)) (list TgtLst))
  40.         ((and (> Num 1) (<= Num (length TgtLst)))
  41.             (apply
  42.               'append
  43.               (mapcar
  44.                 '(lambda (x)
  45.                   (mapcar
  46.                     '(lambda (y) (cons x y))
  47.                     (K:Comb4Lst (vl-remove x TgtLst) (- Num 1))
  48.                   )
  49.                 )
  50.                 (vl-remove-if '(lambda (x) (member x (cdr TgtLst))) TgtLst)
  51.               )
  52.             )
  53.         )  
  54.       )
  55.   )
  56. )

  57. ;用法:
  58. (setq TgtLst '(1 2 3))
  59. (K:Perm4Lst TgtLst 2)
  60. (K:Comb4Lst TgtLst 2)

评分

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

查看全部评分

回复 支持 2 反对 0

使用道具 举报

 楼主| 发表于 2024-3-17 18:16:08 | 显示全部楼层
kucha007 发表于 2024-3-17 16:55
类似这样?我猜你需要的是K:Perm4Lst 排列

感谢
发表于 2024-3-17 18:33:53 | 显示全部楼层
数学中的排列组合嘛
发表于 2024-3-18 12:20:49 来自手机 | 显示全部楼层
递归的,计算量大时,速度慢些
发表于 2024-3-19 17:46:45 | 显示全部楼层
看不懂逻辑关系。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-11-25 21:37 , Processed in 0.225823 second(s), 27 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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