在进行归纳推理时,如果逐个考察了某类事件的所有可能情况,因而得出一般结论,那么这结论是可靠的,这种归纳方法叫做枚举法。枚举法是利用计算机运算速度快、精确度高的特点,对要解决问题的所有可能情况,一个不漏地进行检验,从中找出符合要求的答案,因此枚举法是通过牺牲时间来换取答案的全面性。
在数学和计算机科学理论中,一个集的枚举是列出某些有穷序列集的所有成员的程序,或者是一种特定类型对象的计数。这两种类型经常(但不总是)重叠。
Python实现:有四个数字1、2、3、4,能组成多少个互不相同且无重复数字的三位数?各是多少?
基本思路编辑
采用枚举算法解题的基本思路:
(1)确定枚举对象、枚举范围和判定条件;
(2)枚举可能的解,验证是否是问题的解。
优点
由于枚举法一般是现实生活中问题的“直译”,因此比较直观,易于理解;枚举法建立在考察大量状态、甚至是穷举所有状态的基础上,所以算法的正确性比较容易证明。
缺点
用枚举法解题的最大的缺点是运算量比较大,解题效率不高,如果枚举范围太大(一般以不超过两百万次为限),在时间上就难以承受。但 [3] 枚举算法的思路简单,程序编写和调试方便,比赛时也容易想到,在竞赛中,时间是有限的,我们竞赛的最终目标就是求出问题解,因此,如果题目的规模不是很大,在规定的时间与空间限制内能够求出解,那么我们最好是采用枚举法,而不需太在意是否还有更快的算法,这样可以使你有更多的时间去解答其他难题。
小学阶段可以通过枚举法解决,初中或高中则用到加法原理和乘法原理。用1234可以组成一位数1、2、3、4 ,共4个这很简单;
还可以组成2位数是: 12、13、 14;21、 23、 24;31、 32、34;41、 42、 43 ,没有说不重复当然还有重复数字的数: 11、22、33、44 ,共16个,初高中的解答方法是从4个数里任意取两个数字组成两位数,是一个排列问题,没有重复数字时,十位有4种不同的数字,个位有3个不同的数字,共有4X3=12(个) ,有重复数字的为十位和各位都有4种不同的数字即为4X4=16个。
组成三位数,没有重复数字的:百位上为1时,十位可以是2、3、4,当十位上为2时,个位可以是3或4 ,即组成123、124, 十位上为3、4时也有这样的排列,如下图:
百位上为1: 十位为:2,3,4 得出组成不重复的数字为:123,124,132,134,142,143
百位上为2: 十位为:1,3,4 得出组成不重复的数字为:213,214,231,234,241,243
百位上为3: 十位为:1,2,4 得出组成不重复的数字为:312,314,321,314,321,324
百位上为4: 十位为:1,2,3 得出组成不重复的数字为:412,413,421,423,431,432
百位上为:1,2,3,4时分别都可以得到6个不重复的数字,即总共有4*6=24种排列方法.
初高中则这样解答:三位数有个位十位和百位三个数位,没有重复数字,百位上可以是1、2、 3、4四种,十位上只能是4种,个位上只能是2种,共有4X3X2=24个;
程序分析:
可填在百位、十位、个位的数字都是1、2、3、4。通过for循环多层嵌套把组成所有的排列后,再通过if条件语句去掉不满足条件的排列。最后通关变量统计所有不重复的总个数.
i = 0 # 统计所有不重复的三位数的个数
for x in range(1,5): #最外层循环,确定百位数字
for y in range(1,5): # 确定十位
for z in range(1,5): # 确定个位
if x!=y and x!=z and z!=y: #排除重复数字
i = i+1
print(“%d%d%d”%(x,y,z), end = “,” )
print()
print(‘总数:’,i)
-
扫码下载安卓APP
-
微信扫一扫关注我们
微信扫一扫打开小程序
手Q扫一扫打开小程序
-
返回顶部
发表评论