找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 2541|回复: 15

[每日一码] 由表的元素构成的所有集合

[复制链接]

已领礼包: 1877个

财富等级: 堆金积玉

发表于 2014-11-27 19:31:55 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

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

×
;;;本程序构造表的元素构成的所有集合  如(1  2  3)-->((1)(2)(1 2)(3)(1  3)(2   3)(1   2  3))
;;;本程序引用ZML84的十进制转二进制程序代码
(defun deg->bin        (int / a b)
    (if        (< int 1)
        "0"
        (if (= int 1)
            "1"
            (progn
                (setq a        (/ int 2)
                      b        (- int (* a 2))
                )
                (strcat        (deg->bin a)
                        (itoa b)
                )
            )
        )
    )
)
(DEFUN STR->LIST(STR / lst n)
        (SETQ LST '())
        (SETQ N 1)
        (repeat (STRLEN STR)
                (SETQ LST(CONS (atoi(substr STR N 1)) LST))
                (SETQ N (1+ N))
        )
        (reverse LST)
)
(defun ssbin (n)
   (setq i 1 blst nil)
   (while (<= i n)
        (setq blst (cons (reverse (str->list (deg->bin i))) blst))
        (setq i (+ 1 i))
    )
blst
)
(defun f (lst blst)
  (setq c nil)
  (mapcar '(lambda (x y) (if (= x 1) (setq c  (cons y c))  )) blst lst)
  (reverse c)
)
(defun slst (lst)
   (setq llst nil)
   (setq blst (ssbin (- (lsh 2 (- (length lst) 1)) 1)))
   (foreach e blst
      (setq llst (cons (f lst e) llst))
   )
)
(slst '(1 2 3 4 5 6 7 8 9))

论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

已领礼包: 604个

财富等级: 财运亨通

发表于 2014-11-27 19:58:44 来自手机 | 显示全部楼层
用递归会不会更快?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 40个

财富等级: 招财进宝

发表于 2014-11-27 20:01:42 | 显示全部楼层

能不用递归还是尽量别用,对于非常大的表,递归容易造成堆栈溢出。

另外,递归从来不是为了让代码效率更高设置的编程方法,递归是主要是为了让代码清晰,除非只有用递归才能处理的场合。递归和迭代都能解决问题的时候,迭代更快。因为没有递归所用的堆栈操作。

点评

;;;十进制转二进制 (遗憾n最大只能取 2147483647)(defun fbin (n) (setq lst nil) (while (> n 0) (setq b (rem n 2)) (setq lst (cons b lst)) (setq n (lsh n -1)) ) lst ) (fbin 2147  详情 回复 发表于 2014-11-28 19:37
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 1877个

财富等级: 堆金积玉

 楼主| 发表于 2014-11-27 22:35:17 | 显示全部楼层
本帖最后由 aimisiyou 于 2014-11-28 18:20 编辑

;;;递归算法(注:返回表中多了个空集nil)
(defun ff (lst)
   (if (= lst nil)
       (setq va (list nil))
       (setq va (append (mapcar '(lambda (x) (cons (car lst) x)) (ff (cdr lst))) (ff (cdr lst)) )  )
   )
va
)

(ff '(1 2 3 4 5 6 7 8 9 10))
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 1877个

财富等级: 堆金积玉

 楼主| 发表于 2014-11-28 19:37:24 | 显示全部楼层
本帖最后由 aimisiyou 于 2014-11-28 19:39 编辑
newer 发表于 2014-11-27 20:01
能不用递归还是尽量别用,对于非常大的表,递归容易造成堆栈溢出。

另外,递归从来不是为了让代码效率 ...

;;;十进制转二进制 (遗憾n最大只能取 2147483647)

(defun fbin (n)
   (setq lst nil)
   (while (> n 0)
       (setq b (rem n 2))
       (setq lst (cons b lst))
       (setq n (lsh n -1))
)
   lst
)
(fbin 2147483647)




论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 8121个

财富等级: 富甲天下

发表于 2014-11-29 10:01:08 | 显示全部楼层
这个问题的时间解是O(N!)的,所以对于小量的数据还可以,对于大量的,没有研究的必要了,因为就算把结果列出来也要花费O(N!)的时间。

点评

好像全排列的算法复杂度也是N!,不过带约数的全排列应用的范围更广些,只是没有好的高效算法。  详情 回复 发表于 2015-4-16 23:08
N 还是 N! ?  详情 回复 发表于 2014-11-29 10:03
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 40个

财富等级: 招财进宝

发表于 2014-11-29 10:03:00 | 显示全部楼层
Highflybird 发表于 2014-11-29 10:01
这个问题的时间解是O(N!)的,所以对于小量的数据还可以,对于大量的,没有研究的必要了,因为就算把结果列 ...

N 还是  N! ?

点评

是N !的,就是N的阶乘。  详情 回复 发表于 2014-11-29 11:51
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 604个

财富等级: 财运亨通

发表于 2014-11-29 10:31:38 来自手机 | 显示全部楼层
高飞下结论了,估计楼主没什么想头了。无知者无畏,我大胆猜测一下,把大数写成表,分开计算,然后加起来,如123123

点评

什么叫把大数写成表,分开计算,然后相加?  详情 回复 发表于 2014-11-29 11:51
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 604个

财富等级: 财运亨通

发表于 2014-11-29 10:32:55 来自手机 | 显示全部楼层
如123123写成(123   
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 8121个

财富等级: 富甲天下

发表于 2014-11-29 11:51:11 | 显示全部楼层

是N !的,就是N的阶乘。

点评

本想写个求sn的代码,没思路,就拿这个n元素集合簇简单问题开始。对于求对称群sn,高大师能否指点一二?  详情 回复 发表于 2014-11-29 12:12
Ω={1,2,…,n}时Ω上全体置换所组成的集合S成一个群,称为Ω上的对称群或n元对称群,简称对称群,其阶为 n!。  详情 回复 发表于 2014-11-29 11:59
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 1877个

财富等级: 堆金积玉

 楼主| 发表于 2014-11-29 11:51:53 | 显示全部楼层
/db_自贡黄明儒_ 发表于 2014-11-29 10:31
高飞下结论了,估计楼主没什么想头了。无知者无畏,我大胆猜测一下,把大数写成表,分开计算,然后加起来, ...

什么叫把大数写成表,分开计算,然后相加?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 1877个

财富等级: 堆金积玉

 楼主| 发表于 2014-11-29 11:59:05 | 显示全部楼层
Highflybird 发表于 2014-11-29 11:51
是N !的,就是N的阶乘。

Ω={1,2,…,n}时Ω上全体置换所组成的集合S成一个群,称为Ω上的对称群或n元对称群,简称对称群,其阶为 n!。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 1877个

财富等级: 堆金积玉

 楼主| 发表于 2014-11-29 12:12:00 | 显示全部楼层
Highflybird 发表于 2014-11-29 11:51
是N !的,就是N的阶乘。

本想写个求sn的代码,没思路,就拿这个n元素集合簇简单问题开始。对于求对称群sn,高大师能否指点一二?

点评

不敢,对于对称群,涉及到高深的数学理论,我不懂。  详情 回复 发表于 2014-11-29 12:23
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 8121个

财富等级: 富甲天下

发表于 2014-11-29 12:23:04 | 显示全部楼层
aimisiyou 发表于 2014-11-29 12:12
本想写个求sn的代码,没思路,就拿这个n元素集合簇简单问题开始。对于求对称群sn,高大师能否指点一二?
...

不敢,对于对称群,涉及到高深的数学理论,我不懂。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 1877个

财富等级: 堆金积玉

 楼主| 发表于 2015-4-16 23:08:17 | 显示全部楼层
Highflybird 发表于 2014-11-29 10:01
这个问题的时间解是O(N!)的,所以对于小量的数据还可以,对于大量的,没有研究的必要了,因为就算把结果列 ...

好像全排列的算法复杂度也是N!,不过带约数的全排列应用的范围更广些,只是没有好的高效算法。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|申请友链|Archiver|手机版|小黑屋|辽公网安备|晓东CAD家园 ( 辽ICP备15016793号 )

GMT+8, 2024-9-27 06:44 , Processed in 0.408428 second(s), 65 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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