提要:最近发现自己似乎并没有很好的建立起程序的思维,在学习Python语言程序设计_中国大学MOOC(慕课) (icourse163.org)时有些例子还蛮有趣的,因此进行记录。
好好学习,天天向上
每天努力1%,365天后自己是什么样呢?
每天懈怠1%,365天后自己又是什么样的?
如果一周的某几天加倍努力,某几天懈怠又是什么结果呢?
分析:
对于前两个问题使用数学式子表示为:(1±0.01)^365,使用程序可以直接使用pow(1±0.01, 365)
第三个问题不是那么好直接用数学来表示,如果用程序的思维,我们抽象输入、输出和处理三个部分。
1.输入:一周中努力的天数,努力的倍数;懈怠的天数,懈怠的倍数
2.输出:输出365天后努力与懈怠的结果
3.处理:写一个循环,我们可以先努力后懈怠,那么当天数为努力的日子的时候:执行(1+倍数);当天数为懈怠的时候:执行(1-倍数)。当循环完365天就把结果输出。
def dayDayUp(inc, dec=[0,0]):
"""
因为余1的关系,所以先增后退与先退后增是有影响的
inc[dayup, value]一周中进步天数,进步因子
dec[daydw, value]一周中退步天数,退步因子
return 效果倍数
"""
now = 1.0 #基数
for i in range(365):
if i%7 in range(inc[0]):
now *= (1 + inc[1])
else:
now *= (1 - dec[1])
print("一年后力量:{:.2f}".format(now))
return now
这里把当前的能力设为1,在365天循环之后输出一年以后增长了多少倍。循环往往进行累乘、累加。以一周为周期,所以需要对7取余作为判断。这里计算出的答案与课程中会有差异,因为课程中把周日周天设为0和6,而循环从0开始,那么它表示先懈怠一天然后努力5天然后再懈怠一天,而365/7余1,那么两种方法最后一天存在懈怠和努力的差异,因此结果不同。
暴力解法
因为计算机计算是非常快的,因此对于一些题可以采取穷举法。
小A:工作日努力,周末懈怠1%
小B:每天努力1%
那么小A工作日要多努力才能赶上小B?
def dayDayUp(inc, dec=[0,0]):
"""
因为是余1的关系,所以先增后退与先退后增是有影响的
inc[dayup, value]一周中进步天数,进步因子
dec[daydw, value]一周中退步天数,退步因子
return 效果倍数
"""
now = 1.0 #基数
for i in range(365):
if i%7 in range(inc[0]):
now *= (1 + inc[1])
else:
now *= (1 - dec[1])
#print("一年后力量:{:.2f}".format(now))
return now
#计算a工作日水平要达到什么程度与b每天努力1%一样
b_now = dayDayUp([7,0.01])
#暴力法
upVal_2 = 0.01 #a工作日努力初始值
while dayDayUp([5,upVal_2], [2, 0.01]) < b_now:
upVal_2 += 0.001
now = dayDayUp([5,upVal_2], [2, 0.01])
print("一年后力量:{:.2f}, 进步值:{:.3f}".format(now, upVal_2))
假设小A从1%开始计算,结果小于小B,那么努力值+0.001,直到结果>=小B,将当前努力值输出。
把dayDayup函数进行调用得到365天后的结果,因为其输入参数需要变化,因此用变量进行替代。不断进行判断-更新参数值-判断的过程,将可能进行一一搜索。