经典python程序设计代码

1.聪明的尼姆游戏(人机对战)

实验目的:

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)
    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)))

运行结果

 

2.电影打分与推荐

实验目的:

1、理解基于用户的协同过滤算法原理。

2、熟练运用字典和集合。

3、熟练运用内置函数sum()、min()、len()。

实验内容:

        编写程序,生成数据模拟(也可以使用真实数据)多人对多个电影的打分(1-5分), 然后根据这些数据对某用户A进行推荐。推荐规则为:在已有数据中选择与该用户A的爱 好最相似的用户B,然后从最相似的用户B已看过但用户A还没看过的电影中选择用户B打 分最高的电影推荐给用户A。相似度的计算标准为:1)两个用户共同打分过的电影越多, 越相似;2)两个用户对共同打分的电影的打分越接近,越相似。 

代码

from random import randrange
# 模拟历史电影打分数据
data = {'user'+str(i):{'film'+str(randrange(1, 15)):randrange(1, 6)
for j in range(randrange(3, 10))}
for i in range(10)}
# 当前用户打分数据
user = {'film'+str(randrange(1, 15)):randrange(1,6) for i in range(5)}
# 最相似的用户及其对电影打分情况
# 两个用户共同打分的电影最多
# 并且所有电影打分差值的平方和最小
f = lambda item:(-len(item[1].keys()&user),
    sum(((item[1].get(film)-user.get(film))**2
    for film in user.keys()&item[1].keys())))
similarUser, films = min(data.items(), key=f)
print('known data'.center(50, '='))
for item in data.items():
    print(len(item[1].keys()&user.keys()),
        sum(((item[1].get(film)-user.get(film))**2
        for film in user.keys()&item[1].keys())),
        item,
        sep=':')
print('current user'.center(50, '='))
print(user)
print('most similar user and his films'.center(50, '='))
print(similarUser, films, sep=':')
print('recommended film'.center(50, '='))
# 在当前用户没看过的电影中选择打分最高的进行推荐
print(max(films.keys()-user.keys(), key=lambda film: films[film]))

运行结果

 更多python经典实验,主页查看前几期文章

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

大数据蟒行探索者

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值