Python论坛  - 讨论区

标题:[python-chinese] 趣味问题――号码分配

2004年04月26日 星期一 15:23

liux at gdcn.com liux at gdcn.com
Mon Apr 26 15:23:06 HKT 2004

An HTML attachment was scrubbed...
URL: http://lists.exoweb.net/pipermail/python-chinese/attachments/20040426/d85e9173/attachment.html
-------------- next part --------------
# -*- coding: utf-8 -*-

#号码球问题

#求排列,这里采用迭代算法而非递归,
#是为了得到更好的效率
def P(x, y = None):
	"""
    	求排列数P(x, y),y默认值为x,此时取P(x),即x!
	"""
	if x == 0 or y == 0:
		return 1
    
	re = x
	i = x - 1
	if y == None:
		l = 1
	else:
		l = x - y

	while i > l:
		re *= i
		i -= 1
	return re

#求组合
def C(x, y):
	"""
	求组合数C(x, y)
	"""
	if x == y:
		return 1
	else:
		return P(x, y)/P(y)

#求号码球(Code Ball)问题,CB1使用递归算法:
#1、CB1算法只考虑取出所有球的情况
#	即每一个罐子都有一个球对应,没有空罐。
#2、CB1(0)时,视作有1种解(这种情况下没
#有罐子与球对应);
#3、CB1(1)时,没有解(罐子必然与球对应);
#4、CB1(2)时,有一种解(罐子与球要么完全)
#对应,要么完全不对应;
#5、CB1(n), n>=3可以分解为用所有可能的排列减去
#不合要求的组合。包含有m(m <= n)个重复对应的排
#列数为C(n, m)*CB1(n - m)。m取遍n到1,
#P(n)与C(n, m)*CB1(n - m)之积加和之差,即为所求。
#故:
#CB1(3) = P(3) - C(3, 3)*CB1(3 - 3) - C(3, 2)*CB1(3 - 2) - C(3, 1)*CB1(3 - 1) 
#CB1(n) = P(n) - C(n, n)*CB1(n - n) - C(n, n - 1)*CB1(n - n + 1) - ... - C(n, 1)*CB1(n - 1)
#		= P(n) - C(n, n)*CB1(0) - C(n, n - 1)*CB1(1) - ... - C(n, 1)*CB1(n - 1)
#由C(n, n)==1,CB1(0)==CB1(2)==1,CB1(1)==0,CB1(n)可以简化为:
#CB1(n)=P(n) - 1 - C(n, n - 2) - C(n, n - 3)*CB1(3) - ... - n*CB1(n-1)
def CB1(x):
	if x == 0 or x == 2:
		return 1
	elif x == 1:
		return 0
	else:
		re = P(x) - 1
		for i in range(2, x):
			re -= C(x, x-i)*CB1(i)
		return re

print "CB1算法解得CB1(10) = ", CB1(10)

[导入自Mailman归档:http://www.zeuux.org/pipermail/zeuux-python]

2004年04月26日 星期一 15:42

Zoom.Quiet zoomq at infopro.cn
Mon Apr 26 15:42:43 HKT 2004

Hollo liux:

  嗯嗯!
排列组合的数学方式解是正常思路,但是应该有其它的快速解的!
thinking...

简单,也比较有意思!
收到!

有没类似的 Python 趣味性题集?
咱们联合起来crack them!!!


/******** [2004-04-26]15:41:04 ; you wrote:

liux at gdcn.com> 现有十个分别标有1-10号码的球,十个分别标有1-10号码的罐子。每个球放进一个罐子里,现要求每一个球都不能放在同一号码的罐子中,请问有多少种放法?

liux at gdcn.com> 附件中是我的一种解法,本来以为是一个简单的递归,后来作到凌晨才发现满不是这么一回事儿,要复杂得多。到现在我也不知道这个解是不是对的,欢迎大家讨论。

liux at gdcn.com> 记得上学时作过这道题,当时是用的统计知识,解法要更简单些。

liux at gdcn.com> 还有一种最可靠的方法――只是过于“暴力”――生成一个全排列列表,然后用筛法剔除不合要求的项,最后只要count一下即可。只是忘了全排列算法了……脸红……

liux at gdcn.com> 书到用时方恨少啊!

liux at gdcn.com> PS:我用了那么复杂的递归,运算起来却出乎我意料的快,看来以前是低估了Python解释器的工作效率。



 


********************************************/

-- 
Free as in Freedom

 Zoom.Quiet                           

#=========================================#
]Time is unimportant, only life important![
#=========================================#

sender is the Bat!2.02 CE



[导入自Mailman归档:http://www.zeuux.org/pipermail/zeuux-python]

2004年04月26日 星期一 15:45

Ye Tao Ye.Tao at fujixerox.co.jp
Mon Apr 26 15:45:48 HKT 2004

Skipped content of type multipart/alternative-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: image/gif
Size: 527 bytes
Desc: not available
Url : http://lists.exoweb.net/pipermail/python-chinese/attachments/20040426/608b23dc/attachment.gif

[导入自Mailman归档:http://www.zeuux.org/pipermail/zeuux-python]

2004年04月26日 星期一 16:37

Zoom.Quiet zoomq at infopro.cn
Mon Apr 26 16:37:37 HKT 2004

Hollo jackphil:

  9的阶乘 只是其中一种情况是也乎!…………


/******** [2004-04-26]16:37:19 ; you wrote:

jackphil> 有这么复杂吗,是9的阶乘啊!
jackphil> -----
jackphil> liux at gdcn.com 写道:

>> 现有十个分别标有1-10号码的球,十个分别标有1-10号码的罐子。每个球放进一
>> 个罐子里,现要求每一个球都不能放在同一号码的罐子中,请问有多少种放法?
>>
>> 附件中是我的一种解法,本来以为是一个简单的递归,后来作到凌晨才发现满不
>> 是这么一回事儿,要复杂得多。到现在我也不知道这个解是不是对的,欢迎大家
>> 讨论。
>>
jackphil> _______________________________________________
jackphil> python-chinese list
jackphil> python-chinese at lists.python.cn
jackphil> http://python.cn/mailman/listinfo/python-chinese


********************************************/

-- 
Free as in Freedom

 Zoom.Quiet                           

#=========================================#
]Time is unimportant, only life important![
#=========================================#

sender is the Bat!2.02 CE



[导入自Mailman归档:http://www.zeuux.org/pipermail/zeuux-python]

2004年04月26日 星期一 16:39

jackphil jackphilcn at yahoo.com.cn
Mon Apr 26 16:39:01 HKT 2004

有这么复杂吗,是9的阶乘啊!
-----
liux at gdcn.com 写道:

> 现有十个分别标有1-10号码的球,十个分别标有1-10号码的罐子。每个球放进一
> 个罐子里,现要求每一个球都不能放在同一号码的罐子中,请问有多少种放法?
>
> 附件中是我的一种解法,本来以为是一个简单的递归,后来作到凌晨才发现满不
> 是这么一回事儿,要复杂得多。到现在我也不知道这个解是不是对的,欢迎大家
> 讨论。
>


[导入自Mailman归档:http://www.zeuux.org/pipermail/zeuux-python]

2004年04月26日 星期一 17:04

Ye Tao Ye.Tao at fujixerox.co.jp
Mon Apr 26 17:04:41 HKT 2004

----- Original Message ----- 
From: "jackphil" <jackphilcn at yahoo.com.cn>
To: <python-chinese at lists.python.cn>
Sent: Monday, April 26, 2004 5:39 PM
Subject: Re: [python-chinese] 趣味问题――号码分配


> 有这么复杂吗,是9的阶乘啊!
> -----
> 这个。。。似乎还要斟酌。。。
不过我的到了一点启发。如果有误,还请各位方家指正
我的想法如下,
考虑位置No1,显然,它有9种可能,那么result = 9 * sth;
那么,No1位置目前放置乐某一个数m,那么,我们就去考察位置No.m
显然,No.m现在也有9中可能,因此,result = 9 * 9 * sth;
ok,No.m目前的值为n,于是,我们考察位置No.n,这个位置,现在的可能情况有8种,理
由和上面一样,
所有可能违例的值已经被使用,可以随意的选择。现在result = 9 * 9 * 8 * sth;
哦,很高兴,我们发现乐规律,不是么,
那么,result=9*9*8*7*6.....*3*sth;
再这里,突然发现似乎有一点陷阱。。。。嗯,最后两个数字乐,虽然说,当前的位
置,可以任意挑选而不用担心违例
但是。。。但是最后一位呢?我们以前每一次的选择,都只是将后续一位的违例数字选
出,但是最后一位,可没有人来救它,除非最后第二位
做出一点自由度上面的牺牲。。。于是,只有一种选择德说
因此,rusult=9*9*8*7*...*3*1*1=9*9!/2;
胡。。。我说的到此结束,第。。二次在这里发言,还是很忐忑。。希望不要有什么大
的纰漏,让大家见笑阿



[导入自Mailman归档:http://www.zeuux.org/pipermail/zeuux-python]

2004年04月26日 星期一 17:21

Ye Tao Ye.Tao at fujixerox.co.jp
Mon Apr 26 17:21:17 HKT 2004

哦,不。。。痛苦的事情还是出现乐。。。
我设想的美好世界崩溃乐。。。。
例如,第一位选择乐2, 第二位选择乐1,这样。。我所设想的连环就无以为继
乐。。。。
而且。。。
各位,不好意思,我所说的。。。能收回麽?



[导入自Mailman归档:http://www.zeuux.org/pipermail/zeuux-python]

2004年04月26日 星期一 17:28

Zoom.Quiet zoomq at infopro.cn
Mon Apr 26 17:28:40 HKT 2004

Hollo Ye:

  哈哈哈!
没有什么的,正确永远是在失败的痛苦中绽放的是也乎!

在下晚上回去想一想……


/******** [2004-04-26]17:27:46 ; you wrote:

Ye Tao> 哦,不。。。痛苦的事情还是出现乐。。。
Ye Tao> 我设想的美好世界崩溃乐。。。。
Ye Tao> 例如,第一位选择乐2, 第二位选择乐1,这样。。我所设想的连环就无以为继
Ye Tao> 乐。。。。
Ye Tao> 而且。。。
Ye Tao> 各位,不好意思,我所说的。。。能收回麽?

Ye Tao> _______________________________________________
Ye Tao> python-chinese list
Ye Tao> python-chinese at lists.python.cn
Ye Tao> http://python.cn/mailman/listinfo/python-chinese


********************************************/

-- 
Free as in Freedom

 Zoom.Quiet                           

#=========================================#
]Time is unimportant, only life important![
#=========================================#

sender is the Bat!2.02 CE



[导入自Mailman归档:http://www.zeuux.org/pipermail/zeuux-python]

2004年04月26日 星期一 21:53

CHEN Guang (Oliver) oliver_guang_chen at yahoo.com.cn
Mon Apr 26 21:53:26 HKT 2004

    Èç¹û½ö½öÎÊÓжàÉÙÖÖËã·¨£¬ÄǾÍÊÇ10µÄ½×³ËÁË¡£
   
ÄúµÄÎÊÌâÊÇ´ËÀàÎÊÌâµÄÒ»¸öÌØÀý£¬¸üÆÕ±éµÄÎÊ·¨ÊÇ¡°ÓÐX¸ö¹Þ×Ó·Ö±ð±àºÅ1¡¢2¡¢3¡¢4¡­¡­¡¢X£»Y£¨Y>=X£©¸öÇò·Ö±ð±àºÅ1¡¢2¡¢3¡¢4¡­¡­¡¢Y£¬ÈÎÒâÈ¡³öX¸öÇòÒÔÒ»¹ÞÒ»ÇòµÄ·½Ê½·ÅÈë¹ÞÖУ¬ÎÊÓжàÉÙÖÖ·Å·¨£¿¡±Õâ¾ÍÊÇPXY£¨XΪÉϱ꣬YΪϱ꣩µÄ¶¨ÒåÁË£¬µ±XºÍY¶¼µÈÓÚ10ʱ¾ÍÊÇÄúµÄÎÊÌâÁË£¬½á¹û¾ÍÊÇP
10 10£¨Ò»¸öÉϱ꣬һ¸öϱ꣩Ҳ¾ÍÊÇ10µÄ½×³Ë¡£
   
Èç¹ûÒªÀí½âһϣ¬¿ÉÒԹ̶¨Y=4£¬È»ºó¿¼²éX=1ʱÓжàÉÙÖÖ·Å·¨£¬X=2ʱÓжàÉÙÖÖ·Å·¨¡­¡­
   
¿ÉÊÇÈç¹ûÒªÈüÆËã»ú½«Ã¿ÖÖ¿ÉÄܵÄÇé¿ö¶¼³¢ÊÔÒ»±é£¬»òÕ߶¼´òÓ¡³öÀ´£¬¿ØÖÆÁ÷¾Í·Ç³£¸´ÔÓÁË¡£
   
ÎÒÔøÔÚÆßÄêÇ°±àÖÆÇî¾Ù·¨½â»Ã·½£¨×ݺáͼ£©³ÌÐòʱ¿¼ÂǹýÕâ¸öÎÊÌ⣬½áÂÛÊÇ£ºµ¥´¿µÝ¹éÎÞÄÜΪÁ¦£¬GOTOÓï¾ä±Ø²»¿ÉÉÙ¡£ºÃÔÚµ±Ê±Ê¹ÓõÄ
Turbo C
ÌṩÁËÕâ¸öÓï¾ä£¬²ÅµÃÒÔ½â¾ö¡£¿ÉϧÄǸö³ÌÐòÏÖÔÚÕÒ²»µ½ÁË£¬²»¹ýÄúÈô¸ÐÐËȤ£¬ÎÒ¿ÉÒÔ»ØÒäһϣ¬Ð´Ò»Ð¡¶Î¸øÄú¡£µ±È»ÓÃCÓïÑÔдÁË£¬Python²»ÌṩGOTOÓÐʲô°ì·¨¡­¡­


 --- liux at gdcn.com µÄÕýÎÄ£º
---------------------------------

ÏÖÓÐÊ®¸ö·Ö±ð±êÓÐ1-10ºÅÂëµÄÇò£¬Ê®¸ö·Ö±ð±êÓÐ1-10ºÅÂëµÄ¹Þ×Ó¡£Ã¿¸öÇò·Å½øÒ»¸ö¹Þ×ÓÀÏÖÒªÇóÿһ¸öÇò¶¼²»ÄÜ·ÅÔÚͬһºÅÂëµÄ¹Þ×ÓÖУ¬ÇëÎÊÓжàÉÙÖÖ·Å·¨£¿

¸½¼þÖÐÊÇÎÒµÄÒ»Öֽⷨ£¬±¾À´ÒÔΪÊÇÒ»¸ö¼òµ¥µÄµÝ¹é£¬ºóÀ´×÷µ½Á賿²Å·¢ÏÖÂú²»ÊÇÕâôһ»Øʶù£¬Òª¸´Ôӵöࡣµ½ÏÖÔÚÎÒÒ²²»ÖªµÀÕâ¸ö½âÊDz»ÊǶԵģ¬»¶Ó­´ó¼ÒÌÖÂÛ¡£

¼ÇµÃÉÏѧʱ×÷¹ýÕâµÀÌ⣬µ±Ê±ÊÇÓõÄͳ¼Æ֪ʶ£¬½â·¨Òª¸ü¼òµ¥Ð©¡£

»¹ÓÐÒ»ÖÖ×î¿É¿¿µÄ·½·¨¡ª¡ªÖ»ÊǹýÓÚ¡°±©Á¦¡±¡ª¡ªÉú³ÉÒ»¸öÈ«ÅÅÁÐÁÐ±í£¬È»ºóÓÃɸ·¨ÌÞ³ý²»ºÏÒªÇóµÄÏ×îºóÖ»Òªcountһϼ´¿É¡£Ö»ÊÇÍüÁËÈ«ÅÅÁÐËã·¨ÁË¡­¡­Á³ºì¡­¡­

Êéµ½ÓÃʱ·½ºÞÉÙ°¡£¡

PS£ºÎÒÓÃÁËÄÇô¸´Ôӵĵݹ飬ÔËËãÆðÀ´È´³öºõÎÒÒâÁϵĿ죬¿´À´ÒÔÇ°Êǵ͹ÀÁËPython½âÊÍÆ÷µÄ¹¤×÷ЧÂÊ¡£
> # -*- coding: utf-8 -*-
> 
> #号码球问é¢?> 
>
#求排列,这里采用迭代算法而非递归ï¼?>
#是为了得到更好的效率
> def P(x, y = None):
> 	"""
>     	求排列数P(x,
> y),y默认值为x,此时取P(x),即x!
> 	"""
> 	if x == 0 or y == 0:
> 		return 1
>     
> 	re = x
> 	i = x - 1
> 	if y == None:
> 		l = 1
> 	else:
> 		l = x - y
> 
> 	while i > l:
> 		re *= i
> 		i -= 1
> 	return re
> 
> #求组å?> def C(x, y):
> 	"""
> 	求组合数C(x, y)
> 	"""
> 	if x == y:
> 		return 1
> 	else:
> 		return P(x, y)/P(y)
> 
> #求号码球(Code
> Ball)问题,CB1使用递归算法ï¼?>
#1、CB1算法只考虑取出所有球的情å†?> #
>
即每一个罐子都有一个球对应,没有空罐ã€?>
#2、CB1(0)时,视作æœ?种解(这种情况下æ²?>
#有罐子与球对应)ï¼?>
#3、CB1(1)时,没有解(罐子必然与球对应);
>
#4、CB1(2)时,有一种解(罐子与球要么完全)
> #对应,要么完全不对应ï¼?> #5、CB1(n),
> n>=3可以分解为用所有可能的排列减去
> #不合要求的组合。包含有m(m <=
> n)个重复对应的æŽ?> #列数为C(n, m)*CB1(n -
m)。m取遍nåˆ?ï¼?> #P(n)与C(n, m)*CB1(n -
> m)之积加和之差,即为所求ã€?> #故:
> #CB1(3) = P(3) - C(3, 3)*CB1(3 - 3) - C(3, 2)*CB1(3
> - 2) - C(3, 1)*CB1(3 - 1) 
> #CB1(n) = P(n) - C(n, n)*CB1(n - n) - C(n, n -
> 1)*CB1(n - n + 1) - ... - C(n, 1)*CB1(n - 1)
> #		= P(n) - C(n, n)*CB1(0) - C(n, n - 1)*CB1(1) -
> ... - C(n, 1)*CB1(n - 1)
> #由C(n,
>
n)==1,CB1(0)==CB1(2)==1,CB1(1)==0,CB1(n)可以简化为ï¼?>
#CB1(n)=P(n) - 1 - C(n, n - 2) - C(n, n - 3)*CB1(3)
> - ... - n*CB1(n-1)
> def CB1(x):
> 	if x == 0 or x == 2:
> 		return 1
> 	elif x == 1:
> 		return 0
> 	else:
> 		re = P(x) - 1
> 		for i in range(2, x):
> 			re -= C(x, x-i)*CB1(i)
> 		return re
> 
> print "CB1算法解得CB1(10) = ", CB1(10)
> > _______________________________________________
> python-chinese list
> python-chinese at lists.python.cn
> http://python.cn/mailman/listinfo/python-chinese
>  

_________________________________________________________
Do You Yahoo!? 
»ÝÆÕTTÓÎÏ·¾ç£¬ÍæÓÎÏ·£¬Öд󽱣¡
http://cn.rd.yahoo.com/mail_cn/tag/SIG=1402c0to2/**http%3A%2F%2Fhp.allyes.com%2Flaserjet%2Fgamestory%2Findex.html%3Fjumpid%3Dex_hphqapcn_MongooseLJ1010%2F201073CN407016%2FYahoo


[导入自Mailman归档:http://www.zeuux.org/pipermail/zeuux-python]

如下红色区域有误,请重新填写。

    你的回复:

    请 登录 后回复。还没有在Zeuux哲思注册吗?现在 注册 !

    Zeuux © 2024

    京ICP备05028076号