PYTHON第三次实验

PYTHON第三次实验,第1张

PYTHON第三次实验 PYTHON第三次实验 实验3.1 设计和实现尼姆游戏(人机对战) 一、实验目的
  • 理解尼姆游戏规则
  • 了解多个函数的定义与调用
  • 理解并熟练运行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))

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5671186.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-16
下一篇 2022-12-16

发表评论

登录后才能评论

评论列表(0条)

保存