(董付国)Python 学习笔记---Python控制结构(3)
例 3-13 给定一个包含若干随机整数的列表A,求满足0<=a<=b<n的A[]的最大值。
#高大上的动态规划算法
def maxDifference2(lst):
diff = -float('inf') #正无穷:float('inf')负无穷:float('-inf')
minCurrent = lst[0]
for value in lst[1:]:
if value < minCurrent:
minCurrent = value
else:
t = value - minCurrent
if t > diff:
diff = t
result = (minCurrent,value)
return result[1] - result[0]
A = [1,2,3,4,5,6,9]
print(maxDifference2(A))
例 3-14 模拟蒙蒂霍而悖论游戏。
假设你正参加一个有奖游戏节目,并且有3道门可选:其中一个后面是汽车,另外两个后面是山羊。你选择一个门,比如说1号门,主持人当然知道每个门后面是什么并且打开了另一个门,比如说3号们,后面是一只羊。然后主持人问你“你想改选2号门吗?”那么问题来了,改选的话对你会有利吗?
from random import randrange #randint是返回一个[],
#randrange返回一个[)。
def init():
#返回一个自典,键为3个门号,值为门后面的物品
result = {i:'goat' for i in range(3)}
r = randrange(3)
result[r] = 'car'
return result
def startgame():
#获取本次游戏中每个门的情况
doors = init()
#获取玩家选择的门号
#异常处理结构
while True:
try:
firstDoorNum = int(input('Choose a door to open:'))
assert 0<=firstDoorNum<=2
break
except:
print('Door number must be between {} and {}'.format(0,2))
#主持人查看另外两个门后的情况
for door in doors.keys()-{firstDoorNum}:
#打开其中一个门后面为山羊的门
if doors[door] == 'goat':
print('"goat"behind the door',door)
#获取第三个门号,让玩家纠结
thirdDoor = (doors.keys() - {firstDoorNum}).pop()
change = input('Do you want to switch to {}?(y/n):'.format(thirdDoor))
#如果选择y,就是第三个门,否则就是第一次选择的门
finalDoorNum = thirdDoor if change == 'y' else firstDoorNum
if doors[finalDoorNum] == 'goat':
return 'I win!'
else:
return 'You win.'
while True:
print('='*30)
print(startgame())
r = input('Do you want to try once more?(y/n)')
if r=='n':
break
运行结果测试:
==============================
Choose a door to open:3
Door number must be between 0 and 2
Choose a door to open:1
"goat"behind the door 0
Do you want to switch to 0?(y/n):y
I win!
Do you want to try once more?(y/n)n