明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 569|回复: 6

[提问] 排列组合问题

[复制链接]
发表于 2019-6-3 13:30 | 显示全部楼层 |阅读模式
本帖最后由 sysu-沼泽 于 2019-6-4 08:53 编辑

把n个可重复的元素有次序地放入m个盒子中,要求每个盒子只可以装1个元素,且盒子从大到小排列。求排列的解法。
  1. (setq lst '(3 2 1)) ;元素共3个,n=3
  2. ;;; 盒子数目m=6,想要得出的结果如下所示

  3. (setq data '(  (3 3 3 3 3 3)  (3 3 3 3 3 2)
  4.   (3 3 3 3 3 1)
  5.   (3 3 3 3 2 2)
  6.   (3 3 3 3 2 1)
  7.   (3 3 3 3 1 1)
  8.   (3 3 3 2 2 2)
  9.   (3 3 3 2 2 1)
  10.   (3 3 3 2 1 1)
  11.   (3 3 3 1 1 1)
  12.   (3 3 2 2 2 2)
  13.   (3 3 2 2 2 1)
  14.   (3 3 2 2 1 1)
  15.   (3 3 2 1 1 1)
  16.   (3 3 1 1 1 1)
  17.   (3 2 2 2 2 2)
  18.   (3 2 2 2 2 1)
  19.   (3 2 2 2 1 1)
  20.   (3 2 2 1 1 1)
  21.   (3 2 1 1 1 1)
  22.   (3 1 1 1 1 1)
  23.   (2 2 2 2 2 2)
  24.   (2 2 2 2 2 1)
  25.   (2 2 2 2 1 1)
  26.   (2 2 2 1 1 1)
  27.   (2 2 1 1 1 1)
  28.   (2 1 1 1 1 1)
  29.   (1 1 1 1 1 1)
  30. ))




发表于 2019-6-3 15:47 | 显示全部楼层
3个数中取5个,那么另外2个数是什么取法,这个只有楼主自己知道吧?
发表于 2019-6-3 16:21 | 显示全部楼层
数据量不大时,可以采用递归法。
发表于 2019-6-3 20:47 来自手机 | 显示全部楼层
把问题简化,把三个数3 2 1改成2 1 0,现在的问题就是简化成5位的三进制的问题,问题就清楚了。
发表于 2019-6-3 20:52 来自手机 | 显示全部楼层
本帖最后由 nzl1116 于 2019-6-3 22:00 编辑

(defun func (lst n)
  (cond
    ((not lst) nil)
    ((= n 0) '(nil))
    (T
     (append
       (mapcar
  (function (lambda (x) (cons (car lst) x)))
  (func lst (1- n))
       )
       (func (cdr lst) n)
     )
    )
  )
)
 楼主| 发表于 2019-6-4 08:45 | 显示全部楼层
自贡黄明儒 发表于 2019-6-3 15:47
3个数中取5个,那么另外2个数是什么取法,这个只有楼主自己知道吧?

数字是可以重复的~
 楼主| 发表于 2019-6-4 08:55 | 显示全部楼层
nzl1116 发表于 2019-6-3 20:52
(defun func (lst n)
  (cond
    ((not lst) nil)

谢谢 nzl1116 !递归的写法我一直不大熟,我还需继续学习:P
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-4-19 13:38 , Processed in 2.139152 second(s), 25 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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