2004年08月13日 星期五 11:17
On 2004-08-13 10:57:1092365862 +0800, 王君 wrote: > HD,您好! > 最近,看了下组合数学的一些书,心血来潮,决定把组合数的生成算法,编个程序。可是,自己动手一试,发现原来自己想的算法原来速度非常慢,想了很久,终没有什么好的方法,我现在把问题描述如下: > > 给定 N 个基本字母(当然为了输入方便0<27) ,把N个字母的任意 M 组合情况列举出来(可以输出在文件中)。 > > 我原来的算法是: > > 通过递归的方法,每次确定组合数的一个字母的方法。 > > 发现的问题: > 但是后来发现,这个算法只能应付 N 比较小的情况,一旦 N 大起来,整个算法就需要执行非常久,不知道大家有没有好的方法! 原来写过一个N字母N组合的程序,是在学习 unittest 时写的,也是为了向朋友 展示一下 python 的效率。如果你象我一样,每次只 swap 两个字母的位置,你 会发现程序可以在四五行里搞定,而且运行时间只和结果的数量成线性正比。 好运。
2004年08月13日 星期五 11:20
Xie Yanbo,您好! N字母中M个全排的情况要复杂的多 首先是N中选M 然后是M全排 即使时间和结果数正比 但是结果数随M和N的变化可大了去了 ======= 2004-08-13 11:17:00 您在来信中写道:======= >On 2004-08-13 10:57:1092365862 +0800, 王君 wrote: >> HD,您好! >> 最近,看了下组合数学的一些书,心血来潮,决定把组合数的生成算法,编个程序。可是,自己动手一试,发现原来自己想的算法原来速度非常慢,想了很久,终没有什么好的方法,我现在把问题描述如下: >> >> 给定 N 个基本字母(当然为了输入方便0<27) ,把N个字母的任意 M 组合情况列举出来(可以输出在文件中)。 >> >> 我原来的算法是: >> >> 通过递归的方法,每次确定组合数的一个字母的方法。 >> >> 发现的问题: >> 但是后来发现,这个算法只能应付 N 比较小的情况,一旦 N 大起来,整个算法就需要执行非常久,不知道大家有没有好的方法! > >原来写过一个N字母N组合的程序,是在学习 unittest 时写的,也是为了向朋友 >展示一下 python 的效率。如果你象我一样,每次只 swap 两个字母的位置,你 >会发现程序可以在四五行里搞定,而且运行时间只和结果的数量成线性正比。 >好运。 > >_______________________________________________ >python-chinese list >python-chinese at lists.python.cn >http://python.cn/mailman/listinfo/python-chinese = = = = = = = = = = = = = = = = = = = = 致 礼! guochen guochen at 1218.com.cn 2004-08-13
2004年08月13日 星期五 11:21
Zoom.Quiet,您好! 我看就是将4个数的所有组合计数出来,找到值为24的那个组合就是答案。不过,看了才知道是这么回事,以前从来没想出来过应该如何做。 ======= 2004-08-13 08:43:57 您在来信中写道:======= >Hollo hoxide: > > 不懂! >http://wiki.woodpecker.org.cn/moin.cgi/PyPorgramGames > >启动了游戏收集! > >hoxide 解说一下子?? > > >/******** [2004-08-13]08:43:33 ; hoxide wrote: > >hoxide> 今天在网上同学求教1 5 6 7 用+-*/ 算出21. >hoxide> 自己曾经写过一个,但代码找不到了,偶知道24点的程序很多的说, >hoxide> 于是到网上搜了一下. >hoxide> 是有不少, >hoxide> 但是一个用c++的(其实根本就不能叫用c++,全是c的语法), >hoxide> 试了n多次,borlandc3.1和gcc都不能编译. >hoxide> 还找到了vb,和web版的,看来都没用. >hoxide> 在偶找东西搞得焦头烂额的时候,偶同学自己算出来了.(到底怎么算用这个程序试试吧) > >hoxide> 为了以后不被这种问题困扰,花一个小时用python自己写了一个,还是python好~~~~~~~ > >hoxide> funs = [ lambda x, item: (x+item[0], >hoxide> str(x)+'+('+item[1]+')' >hoxide> ), >hoxide> lambda x, item: (x-item[0], >hoxide> str(x)+'-('+item[1]+')' >hoxide> ), >hoxide> lambda x, item: (item[0]-x, >hoxide> '('+item[1]+')-'+str(x) >hoxide> ), >hoxide> lambda x, item: (x*item[0], >hoxide> str(x)+'*('+item[1]+')' >hoxide> ), >hoxide> lambda x, item: (item[0]==0 and (0,'ZZZ')) or \ >hoxide> (x/item[0], >hoxide> str(x)+'/('+item[1]+')' >hoxide> ), >hoxide> lambda x, item: (x==0 and (0,'ZZZ')) or \ >hoxide> (item[0]/x, >hoxide> '('+item[1]+')/'+str(x) >hoxide> ) >hoxide> ] > >hoxide> def con(num): >hoxide> l = len(num) >hoxide> p = list() >hoxide> if l==1: return {num[0]:str(num[0])} >hoxide> for i in range(l): >hoxide> for f in funs: >hoxide> p += map(lambda item: f(num[i],item), >hoxide> con(num[:i]+num[i+1:]).items() >hoxide> ) >hoxide> return dict(p) > >hoxide> print con(map(float,[1,5,6,7])).get(21.0,0) > > >hoxide> 代码我就不解释了,有问题就问吧. > >hoxide> 另外由于浮点计算的误差问题,".get(21.0,0"这句还不太完善,不过解决这个问题足够了,具体怎么完善大家都知道拉. > >hoxide> hoxide >hoxide> hoxide_dirac at yahoo.com.cn >hoxide> 2004-08-12 > > >********************************************/ > >-- >Free as in Freedom > > Zoom.Quiet > >#=========================================# >]Time is unimportant, only life important![ >#=========================================# > >sender is the Bat!2.12.00 > >_______________________________________________ >python-chinese list >python-chinese at lists.python.cn >http://python.cn/mailman/listinfo/python-chinese > = = = = = = = = = = = = = = = = = = = = 致 礼! limodou chatme at 263.net 2004-08-13
2004年08月13日 星期五 11:27
Xie Yanbo,您好! 你说的N字母N组合的程序,我觉得你是不是弄错了,N字母N组合只有一种组合,你说的每次交换2个字母的位置,这个方法似乎是用来做排列的吧・!我这里说的是列举所有的组合情况。 ======= 2004-08-13 11:17:00 您在来信中写道:======= >On 2004-08-13 10:57:1092365862 +0800, 王君 wrote: >> HD,您好! >> 最近,看了下组合数学的一些书,心血来潮,决定把组合数的生成算法,编个程序。可是,自己动手一试,发现原来自己想的算法原来速度非常慢,想了很久,终没有什么好的方法,我现在把问题描述如下: >> >> 给定 N 个基本字母(当然为了输入方便0<27) ,把N个字母的任意 M 组合情况列举出来(可以输出在文件中)。 >> >> 我原来的算法是: >> >> 通过递归的方法,每次确定组合数的一个字母的方法。 >> >> 发现的问题: >> 但是后来发现,这个算法只能应付 N 比较小的情况,一旦 N 大起来,整个算法就需要执行非常久,不知道大家有没有好的方法! > >原来写过一个N字母N组合的程序,是在学习 unittest 时写的,也是为了向朋友 >展示一下 python 的效率。如果你象我一样,每次只 swap 两个字母的位置,你 >会发现程序可以在四五行里搞定,而且运行时间只和结果的数量成线性正比。 >好运。 致 礼! 王君 bearhand at tom.com 2004-08-13
2004年08月13日 星期五 11:30
王君,您好! N字母M组合简单吧 首先就默认顺序是字典序列 这样就不用考虑是不是重复了 每个字母开头时只往后找 ======= 2004-08-13 11:27:00 您在来信中写道:======= >Xie Yanbo,您好! > > 你说的N字母N组合的程序,我觉得你是不是弄错了,N字母N组合只有一种组合,你说的每次交换2个字母的位置,这个方法似乎是用来做排列的吧・!我这里说的是列举所有的组合情况。 > >======= 2004-08-13 11:17:00 您在来信中写道:======= > >>On 2004-08-13 10:57:1092365862 +0800, 王君 wrote: >>> HD,您好! >>> 最近,看了下组合数学的一些书,心血来潮,决定把组合数的生成算法,编个程序。可是,自己动手一试,发现原来自己想的算法原来速度非常慢,想了很久,终没有什么好的方法,我现在把问题描述如下: >>> >>> 给定 N 个基本字母(当然为了输入方便0<27) ,把N个字母的任意 M 组合情况列举出来(可以输出在文件中)。 >>> >>> 我原来的算法是: >>> >>> 通过递归的方法,每次确定组合数的一个字母的方法。 >>> >>> 发现的问题: >>> 但是后来发现,这个算法只能应付 N 比较小的情况,一旦 N 大起来,整个算法就需要执行非常久,不知道大家有没有好的方法! >> >>原来写过一个N字母N组合的程序,是在学习 unittest 时写的,也是为了向朋友 >>展示一下 python 的效率。如果你象我一样,每次只 swap 两个字母的位置,你 >>会发现程序可以在四五行里搞定,而且运行时间只和结果的数量成线性正比。 >>好运。 > 致 >礼! > > > 王君 > bearhand at tom.com > 2004-08-13 > > > > >_______________________________________________ >python-chinese list >python-chinese at lists.python.cn >http://python.cn/mailman/listinfo/python-chinese = = = = = = = = = = = = = = = = = = = = 致 礼! guochen guochen at 1218.com.cn 2004-08-13
Zeuux © 2025
京ICP备05028076号