python的一个特点就是其强大的扩展库,在做列表和一些其他字符操作时非常方便。
数学中最常见的一个计算问题是排列组合数的计算
1.计算排列组合数
当m和n比较小的时候,用手比较容易得到结果,比如C(4,2)=6,A(5,3)=60
但当数据比较大的时候,计算起来就不那么容易了,比如C(17,4)=2380
为此,可以采用下面的文件进行交互式的得到计算结果:
# --coding=utf-8--
import operator
import string
print ("input n and k:")
strn=raw_input("n:")
strk=raw_input("k:")
n=string.atoi(strn)
k=string.atoi(strk)
def c(n,k):
return reduce(operator.mul, range(n - k + 1, n + 1)) /reduce(operator.mul, range(1, k +1))
def fac(n):
return reduce(operator.mul, range(1,n+1))
def a(n,k):
return reduce(operator.mul, range(n - k + 1, n + 1))
if __name__ == '__main__':
cc=c(n,k)
aa=a(n,k)
fa=fac(n)
print ("c(n,k)= %s" %cc)
print ("a(n,k)= %s" %aa)
print ("fac(n,k)= %s" %fa)
其中fac()函数是计算阶乘的函数,上述用到了python的reduce函数,解释如下:
python中的reduce内建函数是一个二元操作函数,用来将一个数据集合(链表,元组等)中的所有数据进行下列操作:
用传给reduce中的函数 func()(必须是一个二元操作函数)先对集合中的第1,2个数据进行操作,得到的结果再与第三个数据用func()函数运算,最后得到一个结果。
如:
def myadd(x,y):
return x+y
sum=reduce(myadd,(1,2,3,4,5,6,7))
print sum
#结果就是输出1+2+3+4+5+6+7的结果即28
sum=reduce(lambda x,y:x+y,(1,2,3,4,5,6,7))
print sum
值得注意的是在python 3.0.0.0以后, reduce已经不在built-in function里了, 要用它就得from functools import reduce.
2.得到详细的排列组合结果
如果希望根据给出的详细数据,得到所有的可能排列组合,就需要使用python的itertools模块
详细如下:有序排列
import itertools
print list(itertools.permutations([1,2,3,4],2))
会得到[(1, 2), (1, 3), (1, 4), (2, 1), (2, 3), (2, 4), (3, 1), (3, 2), (3, 4), (4, 1), (4, 2), (4, 3)]
同样的,无序组合也可以:
import itertools
print list(itertools.combinations([1,2,3,4],2))
会得到:[(1, 2), (1, 3), (1, 4), (2, 3), (2, 4), (3, 4)]
http://www.tuicool.com/articles/vIRryi
http://blog.csdn.net/perfumekristy/article/details/8526336
http://blog.csdn.net/chjjunking/article/details/6859135