- 理解尼姆游戏规则
- 了解多个函数的定义与调用
- 理解并熟练运行while循环
- 理解带else子句的循环结构执行流程
- 理解循环语句的break语句的作用
- 了解使用循环和异常处理结构对用户输入进行约束的用法
- 养成时刻注意各级代码缩进级别的习惯
尼姆游戏是一个著名的游戏,有很多变种玩法。两个玩家轮流从一堆物品中拿走一部分。在每一步中,玩家可以自由选择拿走多少物品,但是必须至少拿走一个并且最多只能拿走一半物品,然后轮到下一个玩家。拿走最后一个物品的玩家输掉游戏。
在聪明模式中,计算机每次拿走一定数量的物品使得堆的大小是2的幂次方减1—也就是2,7,15,31,63等。如果有一定数量的剩余物品,计算就随机拿走一些。
编写程序,模拟聪明版及非聪明版的尼姆游戏。并进行两种的比较及分析。给出聪明版比非聪明版的胜算结论。
三、实验步骤 (1)需要知道的函数以及用法计算对数函数:math库中的log2(), log()函数等
python中的while else 语句的详细用法:
(45条消息) python中while。。。。else的用法_慕云-CSDN博客_python中while和else
以及try except语句的用法:
(45条消息) Python之异常(try的用法)_蓝七star的博客-CSDN博客_python try
assert断言函数的使用:
(45条消息) Python assert 断言函数_hunyxv的博客-CSDN博客_assert函数python
(2)代码设计思路首先是先选择游戏模式,1为普通模式,2为聪明模式
普通模式和聪明模式的过程差不多,只是在电脑取数时会有不同
普通模式下,电脑随机选择处于[1, n//2]之间的数
def computer_getnormal(n): a = random.randint(1, int(n / 2)) return a
聪明模式下,电脑尽可能选择能使剩下的数为2的幂次减1的数,也就是尽可能地使剩下的数为2,7,15,31,63等
def getnum(n): a = int(math.log2(n)) target = pow(2, a) - 1 get = n - target return get
def computer_getsmart(n): a=getnum(n) if a>int(n/2): a=random.randint(1,int(n/2)) return a(3)总代码
import math import random def getnum(n): a = int(math.log2(n)) target = pow(2, a) - 1 get = n - target return get def computer_getsmart(n): a=getnum(n) if a>int(n/2): a=random.randint(1,int(n/2)) return a def computer_getnormal(n): a = random.randint(1, int(n / 2)) return a def compusmart(): n = random.randint(1, 100) while n>1: print('现在有{}个物品'.format(n)) #from here while True: try: person=int(input("请你输入你要拿走的物件个数:")) assert 1<=person<=n//2 break except: print("请输入1到{}的数".format(n//2)) #till here n = n - person if n==1: print('你赢啦!') break else: computernum=computer_getsmart(n) print('电脑取走{}个物品'.format(computernum)) n=n-computernum print('现在还有{}个物品'.format(n)) else: print('你输啦!') def compunormal(): n = random.randint(1, 100) while n>1: print('现在有{}个物品'.format(n)) # from here while True: try: person = int(input("请你输入你要拿走的物件个数:")) assert 1 <= person <= n // 2 break except: print("请输入1到{}的数".format(n // 2)) # till here n = n - person if n==1: print('你赢啦!') break else: computernum=computer_getnormal(n) print('电脑取走{}个物品'.format(computernum)) n=n-computernum print('现在还有{}个物品'.format(n)) else: print('你输啦!') choice = int(input('1是普通模式,2是聪明模式,请选择游戏模式:')) if choice == 1: print('-------------------普通模式---------------------') compunormal() else: print('-------------------聪明模式---------------------') compusmart()
实验3.2 计算小明爬楼梯的爬法数量 一、 实验目的
- 理解并熟练使用序列解包
- 理解递归函数的工作原理
- 能够编写递归函数代码解决实际问题
- 理解Python字典的用法
- 养成检查和测试循环结构边界条件的习惯
- 养成时刻注意各级代码缩进级别的习惯
假设15个台阶,小明一步最多能上3个台阶。编写程序计算小明上这段楼梯一共有多少种方法。要求给出递推法和递归法两种实现代码。
F(n) = F(n-1) + F(n-2) + F(n-3)
F(1) = 1
F(2) = 2
F(3) = 4
三、实验步骤递推:数学上的概念,主要指递推式、递推数列或递推函数。一个数列的下一项由它前面几项的一种运算(或函数)构成,如 a [ n ] = a [ n − 1 ] + a [ n − 2 ] a[n]=a[n-1]+a[n-2]a[n]=a[n−1]+a[n−2]。
递归:计算机中的概念,主要指计算机上的递归函数,(计算机中的‘函数’不同于数学上的‘函数’,这里指一段代码),即指会调用自己的函数。
def ditui(n): a,b,c=1,2,4#预先设置好前三个台阶的走法 for i in range(n-3): temp1,temp2,temp3=a,b,c a=temp2 b=temp3 c=temp1+temp2+temp3 return c def digui(n): if n==1: return 1 elif n==2: return 2 elif n==3: return 4 else: return digui(n-1)+digui(n-2)+digui(n-3) n=int(input('请输入一个数:')) result1=ditui(n) result2=digui(n) print('递推的结果为:{}'.format(result1)) print('递归的结果为:{}'.format(result2))
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)