前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【每周一坑】乒乓数

【每周一坑】乒乓数

作者头像
Crossin先生
发布2018-04-17 14:19:21
5830
发布2018-04-17 14:19:21
举报

刚从假期回来,又要迎接周末,各位看官想必都很辛苦,所以本周每周一坑为大家准备一道简单的甜点题目,本题取材于伯克利大学 CS61 课程 homework02。

求解乒乓数,题目说明:

乒乓序列从1开始计数,并且始终向上或向下计数。在元素k处,如果k是7的倍数或包含数字7,方向将切换。乒乓序列的前30个元素如下所示,方向交换在第7,14和17,21,第27和28个元素: 1 2 3 4 5 6 [7] 6 5 4 3 2 1 [0] 1 2 [3] 2 1 0 [-1] 0 1 2 3 4 [5] [4] 5 6

定义一个函数 pingpong ,传入一个正整数参数 n ,返回第 n 个乒乓数

def pingpong(n):
    '''
    >>> pingpong(7)
    7
    >>> pingpong(8)
    6
    >>> pingpong(21)
    -1
    >>> pingpong(100)
    2
    >>> pingpong(-1)
    input error
    >>> pingpong(1.0)
    input error    
    '''

附加题:

将原题中为 7 的 k 也作为参数传递给 pingpong 函数,其他条件不变。函数及返回示例如下:

def pingpong(n,k):
    '''
    >>> pingpong(7,7)
    7
    >>> pingpong(8,8)
    8
    >>> pingpong(55,6)
    3
    >>> pingpong(100,9)
    0  
    '''

同学们如果有一些有趣的题目希望拿出来讨论,欢迎分享到评论区,说不定就出现在下期 【每周一坑】 栏目中。

提交代码可以使用 paste.ubuntu.com 或 codeshare.io 等代码分享网站,只需将代码复制上去保存,即可获得一个分享地址,非常方便。

上期【囚徒困境】解答

首先定义三种策略: 策略函数的形式为输入上一轮对方结果(初始为空),返回是自己这一轮的行为。

nice 策略始终返回 ‘silence’

def nice(last_turn):
    return 'silence'

rat 策略始终返回 ‘betray’

def rat(last_turn):
    return 'betray'

tit_for_tat 策略根据上一轮对方的选择做选择,对方上一轮选择合作本轮则选择合作,反之亦然。默认第一轮选择 ‘silence’。

def tit_for_tat(last_turn):
    if last_turn == 'betray':
        return 'betray'
    else:
        return 'silence'

然后定义计算结果的函数,n 为总的轮数,s1,s2 分别为犯人做出的策略,在 python 中函数也是一种对象,所以我们可以直接传递不同的策略函数,避免写一堆if-else。在模拟函数中,以同样的方式调用s1,s2,但由于传递参数不同,得到效果也就不同。

def prison_delimma(n,s1,s2):
    '''计算不同策略下,经过 n 轮之后犯人各自获刑年限
    n  - 博弈总轮数
    s1 - 犯人一选择的策略
    s2 - 犯人二选择的策略

    '''
    # 初始年数与上轮选择
    p1_years,p2_years = 0
    p1_last_turn,p2_last_turn = ''
    for i in range(n):        # 本轮各自选择
        p1_choice = s1(p2_last_turn)
        p2_choice = s2(p1_last_turn)        # 确定结果
        if p1_choice == p2_choice == 'betray':
            p1_years += 2
            p2_years += 2
        elif p1_choice == p2_choice == 'silence':
            p1_years += 1
            p2_years += 1
        elif p1_choice == 'betray' != p2_choice:
            p2_years += 5
        else:
            p1_years += 5
        # 保存本轮结果
        p1_last_turn,p2_last_turn = p1_choice,p2_choice
    return p1_years,p2_years

另外,也可以参考 @王任 同学的答案,简洁直接:

http://paste.ubuntu.com/24291871/

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2017-04-07,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Crossin的编程教室 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档