[D-344] Python 7/100天_综合案例2

==今天的课题
课本:https://reurl.cc/ROvEv6
综合案例2:约瑟夫环问题。
这次不用餵狗,老师贴心的给了个故事内容
想法:
《幸运的基督徒》
有15个基督徒和15个非基督徒在海上遇险,为了能让一部分人活下来不得不将其中15个人扔到海里面去,有个人想了个办法就是大家围成一个圈,由某个人开始从1报数,报到9的人就扔到海里面,他后面的人接着从1开始报数,报到9的人继续扔到海里面,直到扔掉15个人。由于上帝的保佑,15个基督徒都幸免于难,问这些人最开始是怎么站的,哪些位置是基督徒哪些位置是非基督徒。
尝试找出规律=先把问题简化
假设今天只有4个人,o基x不基,数到三丢的话,站法会是
第一回合(o=2/2,x=2/2)
oxxo
123
第二回合(o=2/2,x=1/2)
oxo
231
··········基督教胜利(o=2/2,x=0/2)
思路:
1.建立一个空list当作排队的基础
2.顺序随机(用前一次练习双色球的电脑选号法,两色球各15号?)
3.删除队伍中的第九位list.pop(8)
4.用if搭配list.count检查剩余基督是否为15,若True则print
==
试着参考了前面几个练习学到的东东,结果算是完成了一个堪用的

def line_up(people=30):    line=[]    for _ in range(people//2):        line.append('A')        line.append('B')    line=sample(line,30)    return linedef resecute(line):    kill=True    result=line[:]    while kill:        result.pop(8)        if len(result)==15:            kill=False        number=result.count('A')    return numberdef yep():    LordWin=True    last_stand_christian=0    while LordWin:        last_stand_christian=resecute(line_up())        if last_stand_christian==14:            LordWin=False            print(line_up())yep()

说是堪用的原因是我run了很多次才找到剩余基督徒=14的答案,15还没run成功过
这或许代表
1.我的电脑太烂
2.程式执行了太多重複的东西,或许可以进行简化
看答案

def main():    persons = [True] * 30 #在列表中建立30个布林=30个活人    counter, index, number = 0, 0, 0 #击杀数、死亡宣告器/、9计数器    while counter < 15: #击杀数小于15前会执行下列程式码:        if persons[index]: #若人未死(index=True)执行以下程式码:            number += 1 #计数器+1            if number == 9: #若计数器达9执行以下程式码:                persons[index] = False #宣判死亡                counter += 1 #击杀数+1                number = 0 #计数器归零        index += 1 #下面一位~        index %= 30 #这边不大懂    for person in persons:        print('基' if person else '非', end='')if __name__ == '__main__':    main()

index %= 30 #这边不大懂为何要这样做,不过在我改了一下他的数字后出现的是index out of range,所以或许这就是让程式简洁的关键
总之目前观察到,我的逻辑是:
产生两人队伍_随机组合_九步一杀_找出完美的组合
老师的逻辑是:
产生活人队伍_九步1杀_标记剩余的组合
重构一波

def line_up(people=30):    line=[True]*people    return linedef kill(line):    index,count,kill=0,0,0    count=line.count(False)    while count<15:        if line[index]:            kill+=1            if kill==9:                line[index]=False                kill=0    return last_linedef assign(last_line):    print('C'if True else'X')assign(kill(line_up))

目前遇到的问题是'function' object has no attribute 'count'
下班再继续~
====
结果下了个班以后有一堆事情,弄一弄就过了四天才能重拾程式码,没有固定时间学习的坏处就在这,不过固定时间学习的坏处就是不太能接受突发的状况呢
重看了一遍我四天前写的东西,感觉错的点不在于我怎么写,而是一开始的分析:
逻辑上虽然缩小了整个问题的队伍规模,但我如果把整个流程抽出来应该不难发现除了「排队把可能性一个一个试过再挑出需要的」以外还有更简单的作法
没有把整件事情的逻辑都整理好就急着开始写是这次的问题
后面看了答案之后在重构时,因为不想把老师的答案複製贴上,于是尝试保留自己原先设想的部分,目标想以我的东西为基础像是把整个流程分为三个function加上老师的概念来写
但是又遇到新的问题,我上面有记录下来
====
先说结论:
因为学习进度实在落后到有点多,所以我打算把这题先解析到这里先进行下一章的学习
感谢前一篇中有位前辈在文章的回应中表示看了答案之后要不把自己的程式码进行重构永远不会变成经验,这句话从侧面点醒了我
原本学习的方式是笔直的前进,遇到难题就一直停在那边想,虽然这件事情可以很好的培养耐心,但随着难度加大,停留的时间越来越久,这种学习方式会产生的坏处就越显而易见,其中最明显的莫过于对程式的手感越来越生疏了。
原本死不看答案的原因就是怕看了答案会失去这次进步的机会,但前辈的话让我明白就算看了答案不重构就还是不会。
也就是说其实我可以在遇到任何程式就直接解析一波,这样很容易就能知道自己是不会还是忘记,再针对发现的问题去做下一步的学习/补强
希望这个发现能让我掌握最佳的学习节奏,补强我在自学最缺乏的--安排进度的能力ㄋ


关于作者: 网站小编

码农网专注IT技术教程资源分享平台,学习资源下载网站,58码农网包含计算机技术、网站程序源码下载、编程技术论坛、互联网资源下载等产品服务,提供原创、优质、完整内容的专业码农交流分享平台。

热门文章