号码球
现有十个分别标有1-10号码的球,十个分别标有1-10号码的罐子。每个球放进一个罐子里,现要求每一个球都不能放在同一号码的罐子中,请问有多少种放法?
思路:
假设n个球时,号码不重复的放法有F(n)个,这时又来了一个罐子和一个球在n+1位置,我们利用球n+1和其它球交换来得到新的放法。
有两种情况适合:
第一种情况:就是原来n个球是不重复的,我加入第n+1球和位置n+1,开始我把球n+1放在位置1,其余n个球不重复放在n个位置的方法有F(n)种,以此类推我把球放在2,3,4……n各有F(n)种,所以第一种情况的方法共有n*F(n)
第二种情况:就是原来n个球有一个球号码重复放在一起,所以原始情况方法是F(n-1),之后我新加入的球n+1和重复号码的那个球交换,重复号码从1到n有n个符合情况,所以第二种情况共有方法n*F(n-1)
所以综上:F(n+1)=n*(F(n)+F(n-1)).
代码:
-
#!/usr/bin/env python
-
-
def F(n):
-
if n == 1: return 0
-
if n == 2: return 1
-
-
Fn, Fn_1 = 1, 0
-
for i in xrange(2, n):
-
Fn, Fn_1 = i * (Fn + Fn_1), Fn
-
else:
-
return Fn
-
-
print F(10)
如果8,9行有点难理解,可以看下面C风格的代码,不过那样不pythonic
for i in xrange(2, n):
current=i * (Fn + Fn_1)
Fn_1=Fn
Fn=current
参考于http://wiki.woodpecker.org.cn/moin/PyProgramGames/CodeBall
2009年6月08日 18:31
这个叫错排数吧?
2009年6月09日 01:08
不知道专业名词叫什么,呵呵……