用Python复习离散数学(二)

  这次复习的是计数问题,立刻走起吧!

  1.乘法原理

    如果一项工作需要t步完成的,第一步有n1种不同的选择,第二步有n2种不同的选择,……,第t步有nt中不同的选择,那么完成这项工作所有可能的选择种数为:

      n1 x n2 x …… x nt

def multiply(*args):
    count = 0
    for x in args:
        count *= x
    print "the all possible choices is %d" % count

  2.加法原理

    假定X1,X2,……,Xt均为集合,第i个集合Xi有ni个元素,则可以从X1,X2,……,Xt中选出的元素总数为:

      n1 + n2 + …… + nt

def add(*args):
    count = 0
    for x in args:
        count += x
    print "the total number is %d" % count

  3.排列问题

    从含n个不同元素的集合S总有序选取的r个元素叫做S的一个r排列,不同的排列总数记为P(n, r),如果r = n,则称这个排列为S的一个全排列,简称为S的排列。

下面是在对集合中进行排列,添加了几个方法:

    def remove(self, element):
        self.s.remove(element)
        self.__num -= 1
        
    def copy(self):
        setTemp = MySet()
        for x in self.s:
            setTemp.add(x)
        return setTemp
        
    def rank(self, n):
        if n <= self.__num and n > 0:
            setTemp = MySet()
            self.rankHelp(setTemp, n, '', self)
            return setTemp
        else:
            print 'Error in parameter'
        
    def rankHelp(self, setTemp, n, element, s1):
        if n == 1:
            for x in s1.s:
                e = element
                e += x
                setTemp.add(e)
        else:
            for x in s1.s:
                temp = s1.copy()
                e =  element
                e += x
                temp.remove(x)
                self.rankHelp(setTemp, n-1, e, temp)

  4.组合问题

    从含有n个不同元素的集合S中无序选取的r个元素叫做S的一个r组合,不同的组合数记为C(n, r)。

    def build(self, temp):
        setTemp = MySet()
        for x in temp:
            setTemp.add(x)
        return setTemp
    
    def group(self, n):
        if n <= self.__num and n > 0:
            setTemp = MySet()
            self.groupHelp(setTemp, n, '', self)
            return setTemp
        else:
            print 'Error in parameter'
    
    def groupHelp(self, setTemp, n, element, s1):
        if n == 1:
            for x in s1.s:
                e = element
                e += x
                setTemp.add(e)
        elif n == s1.__num:
            for x in s1.s:
                element += x
            setTemp.add(element)
        else:
            for x in range(s1.length()-n+1):
                e = element
                e += s1.get(x)
                temp = self.build(s1.s[x+1:])
                self.groupHelp(setTemp, n-1, e, temp)

  5.容斥原理

    所谓的容斥,是指我们计算某类物体的数目的时候,要排斥那些不应包含在这个计数中的数目,但同时要包容那些被错误地排斥了的数目,以此补偿,这个原理称为容斥原理。

  6.鸽笼原理

    若有n+1只鸽子住进n个鸽笼,则有一个鸽笼至少住进2只鸽子。

原文地址:https://www.cnblogs.com/rayguo/p/3481235.html