物联网编程技术(Python)实验六、理解浮点数运算的误差实验目的:1、理解组合数定义式的化简。2、理解浮点数运算的误差和可能带来的问题。实验内容:阅读并调试下面的代码,分析代码功能,发现并解决代码中的错误。def cni(n,i):minNI=min(i,n-i)result = 1for jin range(o,minNI):result=result *(n-j)//(minNI-j)return result提示:这段代码试图计算组合数C,但是由于浮点数除法时精度问题导致结果错误。12
物联网编程技术(Python) 12 n 实验六、理解浮点数运算的误差 实验目的: 1、理解组合数定义式的化简。 2、理解浮点数运算的误差和可能带来的问题。 实验内容: 阅读并调试下面的代码,分析代码功能,发现并解决代码中的错误。 def cni(n,i): minNI = min(i, n-i) result = 1 for j in range(0, minNI): result = result * (n-j) // (minNI-j) return result 提示: 这段代码试图计算组合数C i ,但是由于浮点数除法时精度问题导致结果错误
物联网编程技术(Python)实验七、小明爬楼梯实验目的:1、理解并熟练使用序列解包。2、理解递归函数工作原理。3、能够编写递归函数代码解决实际问题。4、理解Python字典的用法。实验内容:假设一段楼梯共15个台阶,小明一步最多能上3个台阶。编写程序计算小明上这段楼梯一共有多少种方法。要求给出递推法和递归法两种代码。参考代码:def climbstairsi(n):#递推法a=1b=2c = 4for i in range(n-3):C, b, a = a+b+c, c, breturn cdef climbstairs2(n):#递归法first3=(1:1, 2:2, 3:4)if n in first3.keys():return first3[n]else:returnclimbstairs2(n-1)+climbstairs2(n-2)+climbstairs2(n-3)print(climbstairs1(15))print(climbStairs2(15))13
物联网编程技术(Python) 13 实验七、小明爬楼梯 实验目的: 1、理解并熟练使用序列解包。 2、理解递归函数工作原理。 3、能够编写递归函数代码解决实际问题。 4、理解 Python 字典的用法。 实验内容: 假设一段楼梯共 15 个台阶,小明一步最多能上 3 个台阶。编写程序计算小明上这段楼 梯一共有多少种方法。要求给出递推法和递归法两种代码。 参考代码: def climbStairs1(n): #递推法 a = 1 b = 2 c = 4 for i in range(n-3): c, b, a = a+b+c, c, b return c def climbStairs2(n): #递归法 first3 = {1:1, 2:2, 3:4} if n in first3.keys(): return first3[n] else: return climbStairs2(n-1) + \ climbStairs2(n-2) + \ climbStairs2(n-3) print(climbStairs1(15)) print(climbStairs2(15))
物联网编程技术(Python)实验八、聪明的尼姆游戏(人机对战)实验目的:1、理解尼姆游戏规则。2、了解多个函数定义与调用。3、理解并熟练运用while循环。4、理解带else子句的循环结构执行流程。5、理解循环语句中的break语句的作用。6、了解使用循环和异常处理结构对用户输入进行约束的用法。实验内容:尼姆游戏是个著名的游戏,有很多变种玩法。两个玩家轮流从一堆物品中拿走一部分。在每一步中,玩家可以自由选择拿走多少物品,但是必须至少拿走一个并且最多只能拿走一半物品,然后轮到下一个玩家。拿走最后一个物品的玩家输掉游戏。在聪明模式中,计算机每次拿走足够多的物品使得堆的大小是2的幂次方减1一一也就是3,7,1531或63。除了堆的大小已经是2的幂次方减1,在其他情况下这样走都是符合游戏规则的。在那种情况下,计算机就按游戏规则随机拿走一些。编写程序,模拟聪明版本的尼姆游戏。参考代码:from math import 1og2from random importrandint,choicedef everystep(n):half =n / 2m = 1#所有可能满足条件的取法possible = []while True:rest = 2**m - 1if rest >= n:breakif rest >= half:possible.append(n-rest)m=m+1#如果至少存在一种取法使得剩余物品数量为2^n-1if possible:return choice(possible)14
物联网编程技术(Python) 14 实验八、聪明的尼姆游戏(人机对战) 实验目的: 1、理解尼姆游戏规则。 2、了解多个函数定义与调用。 3、理解并熟练运用 while 循环。 4、理解带 else 子句的循环结构执行流程。 5、理解循环语句中的 break 语句的作用。 6、了解使用循环和异常处理结构对用户输入进行约束的用法。 实 验内容: 尼姆游戏是个著名的游戏,有很多变种玩法。两个玩家轮流从一堆物品中拿走一部分。 在 每一步中,玩家可以自由选择拿走多少物品,但是必须至少拿走一个并且最多只能拿走一半物 品,然后轮到下一个玩家。拿走最后一个物品的玩家输掉游戏。 在聪明模式中,计算机每次拿走足够多的物品使得堆的大小是 2 的幂次方减 1——也就 是 3,7,15,31 或 63。除了堆的大小已经是 2 的幂次方减 1,在其他情况下这样走都是符合游 戏规则的。在那种情况下,计算机就按游戏规则随机拿走一些。 编写程序,模拟聪明版本的尼姆游戏。 参考代码: from math import log2 from random import randint, choice def everyStep(n): half = n / 2 m = 1 # 所有可能满足条件的取法 possible = [] while True: rest = 2**m - 1 if rest >= n: break if rest >= half: possible.append(n-rest) m = m+1 # 如果至少存在一种取法使得剩余物品数量为 2^n-1 if possible: return choice(possible)
物联网编程技术(Python)#无法使得剩余物品数量为2^n-1,随机取走一些return randint(1,int(half))def smartNimuGame(n):while n > 1:#人类玩家先走print("Now it's your turn, and we have (0) left.".format(n))#确保人类玩家输入合法整数值while True:try:num = int(input('How many do you want to take:'))assert 1<=num<=n//2breakexcept:print('Error.Must be between 1 and ()'.format(n//2))n -= numifn==1:return 'I fail."#计算机玩家拿走一些n -= everystep(n)else:return 'You fail.'print(smartNimuGame(randint(1,100)))15
物联网编程技术(Python) 15 # 无法使得剩余物品数量为 2^n-1,随机取走一些 return randint(1, int(half)) def smartNimuGame(n): while n > 1: # 人类玩家先走 print("Now it's your turn, and we have {0} left.".format(n)) # 确保人类玩家输入合法整数值 while True: try: num = int(input('How many do you want to take:')) assert 1 <= num <= n//2 break except: print('Error.Must be between 1 and {0}'.format(n//2)) n -= num if n == 1: return 'I fail.' # 计算机玩家拿走一些 n -= everyStep(n) else: return 'You fail.' print(smartNimuGame(randint(1, 100)))
物联网编程技术(Python)实验九、蒙蒂霍尔悸论游戏实验目的:1、了解蒙蒂霍尔悖论内容。2、了解游戏规则。3、熟练运用字典方法和集合运算。4、了解断言语句assert的用法。5、熟练运用循环结构。实验内容:假设你正参加一个有奖游戏节目,并且有3道门可选:其中一个后面是汽车,另外两个后面是山羊。你选择一个门,比如说1号门,主持人当然知道每个门后面是什么并且打开了另一个门,比如说3号门,后面是一只山羊。这时,主持人会问你"你想改选2号门吗?",然后根据你的选择确定最终要打开的门,并确定你获得山羊(输)或者汽车(赢)。编写程序,模拟上面的游戏。参考代码:from random import randrangedef init():返回一个字典,键为3个门号,值为门后面的物品result =(i:'goat'for i in range(3))r = randrange(3)result[r] ='carreturn resultdef startGame():#获取本次游戏中每个门的情况doors = init()#获取玩家选择的门号while True:try:firstDoorNum=int(input('Chooseadoortoopen:'))assert 0<=firstDoorNum<=2breakexcept:print('Doornumbermustbe between()and('.format(o,2))#主持人查看另外两个门后的物品情况for door in doors.keys()-{firstDoorNum):#打开其中一个后面为山羊的门16
物联网编程技术(Python) 16 实验九、蒙蒂霍尔悖论游戏 实验目的: 1、了解蒙蒂霍尔悖论内容。 2、了解游戏规则。 3、熟练运用字典方法和集合运算。 4、了解断言语句 assert 的用法。 5、熟练运用循环结构。 实验内容: 假设你正参加一个有奖游戏节目,并且有 3 道门可选:其中一个后面是汽车,另外两个 后面是山羊。你选择一个门,比如说 1 号门,主持人当然知道每个门后面是什么并且打开了 另一个门,比如说 3 号门,后面是一只山羊。这时,主持人会问你"你想改选 2 号门吗?", 然后根据你的选择确定最终要打开的门,并确定你获得山羊(输)或者汽车(赢)。 编写程序,模拟上面的游戏。 参考代码: from random import 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}: # 打开其中一个后面为山羊的门