龙空技术网

玩蛇(Python) - 算法:排列组合

山狗学会 65

前言:

而今兄弟们对“编程计算组合数”大致比较注重,大家都需要了解一些“编程计算组合数”的相关内容。那么小编同时在网络上网罗了一些有关“编程计算组合数””的相关资讯,希望小伙伴们能喜欢,同学们一起来学习一下吧!

一、排列组合的数学意义

加法原理

做一件事,完成它可以有n类办法,在第一类办法中有m1种不同的方法,在第二类办法中有m2种不同的方法,……,在第n类办法中有mn种不同的方法,那么完成这件事共有N=m1+m2+m3+…+mn种不同方法。每一类中的每一种方法都可以独立地完成此任务。

乘法原理

做一件事,完成它需要分成n个步骤,做第一步有m1种不同的方法,做第二步有m2种不同的方法,……,做第n步有mn种不同的方法,那么完成这件事共有N=m1×m2×m3×…×mn种不同的方法。任何一步的一种方法都不能完成此任务,必须且只须连续完成这n步才能完成此任务。

排列的定义

从n个不同元素中,任取m(m≤n,m与n均为自然数,下同)个不同的元素按照一定的顺序排成一列,叫做从n个不同元素中取出m个元素的一个排列;从n个不同元素中取出m(m≤n)个元素的所有排列的个数,叫做从n个不同元素中取出m个元素的排列数,用符号A(n,m) 表示。

排列是有顺序的,例如:排列123 和排列213是两个独立的排列,每个数字的位置看成一步,排列的原则就符合乘法原理。

推导出公式:A(n,m) = n*(n-1)*(n-2)*...*(n-m+2)*(n-m+1)

组合的定义

从n个不同元素中,任取m(m≤n)个元素并成一组,叫做从n个不同元素中取出m个元素的一个组合;从n个不同元素中取出m(m≤n)个元素的所有组合的个数,叫做从n个不同元素中取出m个元素的组合数。用符号 C(n,m) 表示。

组合没有顺序,只看元素,例如:组合123和组合213是同一个组合。组合相比于排列,就是去除数字相同的排列。

推导出公式:C(n,m) = A(n,m)/A(m,m) = n*(n-1)*(n-2)*...*(n-m+2)*(n-m+1)/ m*(m-1)*...*1

二、排列组合编程实例

需求描述

1、排列需求

1)给定自然数集合,从1开始 [1,2,3,...,n]

2)给出算法计算全排列,并按照从小到大顺序排列。

3)给出最大自然数n,返回第m个排列, str格式

2、组合需求

1)给出水果种类List,包含n种水果

2)给出m个水果的组合,m <=n

源码

#-*- coding:utf-8 -*-import itertools as itclass PermSGXH(object):       def perm(self, maxNaturalNo:int, retPermNo:int):        #生成自然数集合        natureNoList = [y for y in range(1, maxNaturalNo + 1)]        permList = list(it.permutations(natureNoList))        # print(permList)        return permList[retPermNo-1]       def comb(self, fruitList:list, noOfSelected:int):        return list(it.combinations(fruitList, noOfSelected))if __name__ == '__main__':    p = PermSGXH()       #123    print(p.perm(3,1))      #213      print(p.perm(3,3))    #2314    print(p.perm(4,9))       #给出5种水果,选出3种水果的组合    fruitList = ['苹果','火龙果','李子','桃子','香蕉']    noOfSelected = 3       print(p.comb(fruitList,noOfSelected))
验证结果
PS D:\Shangouxuehui_Git\PythonAlgorithm-main> & D:/Python312/python.exe d:/Shangouxuehui_Git/PythonAlgorithm-main/sgxh_permutation_combination.py(1, 2, 3)(2, 1, 3)(2, 3, 1, 4)[('苹果', '火龙果', '李子'), ('苹果', '火龙果', '桃子'), ('苹果', '火龙果', '香蕉'), ('苹果', '李子', '桃子'), ('苹果', '李子', '香蕉'), ('苹果', '桃子', '香蕉'), ('火龙果', '李子', '桃子'), ('火龙果', '李子', '香蕉'), ('火龙果', '桃子', '香蕉'), ('李子', '桃子', '香蕉')]PS D:\Shangouxuehui_Git\PythonAlgorithm-main>

代码下载:

##山狗学会 License Start##

转载请注明出处,"今日头条"创作者"山狗学会“ ,注明出处即授权,未注明出处罚款100万元

主页链接:山狗学会主页

##山狗学会 License End##

标签: #编程计算组合数 #编程计算组合数怎么算 #组合数编程实现