穷举算法
穷举说白了就是把所有情况都例举处来,看情况是否合适,不合适的就不要合适的留下,进行操作。
今天刚笔试就遇到了这种题然后我并不会做,赶紧来复习一下基础。
(基础真的而很重要!基础真的而很重要!基础真的而很重要!重要的事情要说3遍!)
24点游戏的描述
24点游戏是指随机选取4张扑克牌(不包括大小王), 然后通过四则运算来构造表达式,如果表达式的值恰好等于24就赢一次。
下面的代码定义了一个函数用来测试随机给定的4个数是否符合24点游戏规则,如果符合就输出所有可能的表达式。
用到这两方法进行代码编写:
- itemtools.permutations
- itemtools.product
from itertools import permutations,product
a=[3,8,8,9]
for i in permutations(a,len(a)):
for j in product('+-*/',repeat=3):#从四个符号中选出三个符号,可重复的哦
#print(('({0}{1}{3}{4}{5}{6})'.format(*i,*j)))
b1='({0}{4}{1}){5}({2}{6}{3})'.format(*i,*j)#总共只有三种条件,所以就穷举出来啦,这就是代码的思想吧
b2='(({0}{4}{1}){5}{2}){6}{3}'.format(*i,*j)
b3='{0}{4}({1}{5}({2}{6}{3}))'.format(*i,*j)
for bds in [b1,b2,b3]:
try:
if abs(eval(bds))-24.0<=1e-10:#这里用到eval函数,取近似值
print(bds)
except ZeroDivisionError: ##即使有遇到被除数是0的情况也会继续下去
continue
这里用到了好多知识点,吓的我赶紧去补了一下:
1. itemtools.permutations 的使用
这里就要讲另外一个方法来做比较了,那就是combinations,这个方法和permutations就是我们所说的排列组合了。
- combinations:重在组合
import itertools
a=[1,2,3]
for i in itertools.combinations(a,2):
print(i)
(1, 2)
(1, 3)
(2, 3)
- permutations:重在排列
import itertools
a=[1,2,3]
for i in itertools.permutations(a,2):
print(i)
(1, 2)
(1, 3)
(2, 1)
(2, 3)
(3, 1)
(3, 2)
还有就是,combinations和permutations返回的是对象地址,原因是在python3里面,返回值已经不再是list,而是iterators(迭代器),
所以想要使用,只用将iterator 转换成list 即可, 还有其他一些函数返回的也是一个对象,需要list转换,比如list(map())等 。
2…format()方法的使用
其实就是format()后面的内容,填入大括号中(可以按位置,或者按变量)
'数字{1}{2}和{0}'.format("123",456,'789')
>>>'数字456789和123'
#这里注意有两层大括号,输出的结果只有一层大括号
'数字{{{1}{2}}}和{0}'.format("123",456,'789')
>>>'数字{456789}和123'
#可以通过添加关键字参数
'{name}{age}岁'.format(age=22,name='jc')
>>>'jc22岁'
#允许一个参数用两次
'{1}{0}{1}岁'.format('jc',22)
>>>'22jc22岁'
上了代码之后就整的明明白白了。
3.try except 捕获异常
try:
print(5/0)
except ZeroDivisionError:#捕获被除数是0的异常
print('haha')
使用到的一般还有:
4.多行输入:
list1=[]
while True:
try:
list1.append(input())
except: #由于没有判断条件,不会终止
break
又或者是
import sys
lines=sys.stdin.readlines()
print(lines)
5. 1e-10
代表的是1乘以10的-10次方
6. abs() 函数
返回数字的绝对值
今天又学到了东西呢,鼓励自己一下。棒棒哒。