逻辑思维第3章和第4章讲 逻辑思维 ,其实还是对 简单重复 的练习,上一章我们过了5个思维训练,这一章再过5个。

(没错,我们这节课来做2号线)

我们从一个 "数学王子",高斯的故事开始说吧。
有一次数学课堂上,老师要求计算 1 + 2 + 3 + .... 100 ;也就是从1加到100,求和。
高斯很聪明,这么算的 (1+100)*50 (算式)
而高斯的同学呢,则是这么算的,1+2 = 3, 3+3 = 6, 6 + 4 = 10, ..... (循环)
请你把这两种方法用Python程序来表示
sum = 1 + 2 + 3 + .... 100 能计算出结果吗?(答案是不能).... 这个表示法,我们在Python里是找不到对应的运算的。(这是典型的人可以读懂,但Python读不懂)
高斯的算法
sum = (1+100)*50
print(sum)
循环 程序的关键是把要 重复执行 的逻辑抽象出来,在这个例子里,重复的事 1+2 3+3 6+4 ..a + b ;其中a是到前一步为止算得的和 b 是 2 3 4 ... 100 换言之,就是每次循环b就加1
a = 0 #和为0b = 1while b <= 100:a = a + b #求和b = b + 1 #加1 print(a)
b < 100 还是 b <= 100 犯迷糊,其实完全可以写一个,最后把b打印出来看一下
很多人有早晨跑步的习惯,下面的一段话记录了小明今天晨跑的情况,请你用Python来计算一下
我早上六点五十二分出家门,以8:15的节奏跑了一英里,又以7:12的节奏跑了三英里,然后又是8:15的节奏跑了一英里,回到家吃饭是几点?
代码块思想,我们把这个问题分为 计算结束时间算法 和 计算总用时算法计算结束时间算法 输入:开始时间(注意是小时和分),总用时(分)
h_begin = 6
m_begin = 52
HOUR = 60
total = 8/15 * 60 * 1 + 7/12 * 60 * 3 + 8/15 * 60 *1
total = int(total) #一定要先转int整型
h = total // HOUR
m = total % HOUR
h_end = h_begin + h
m_end = m_begin + m
if m_end >= HOUR: #注意是>=
h_end = h_end+1
m_end = m_end % HOUR
print(str(h_end) + "点" + str(m_end) + "分" #还记得str吗?
试一下 在线Python
`
循环设计的朋友可以尝试识别一下这个算法里重复的运算是什么?+ 4/(2*3*4)- 4/(4*5*6)+ 4/(6*7*8)n 刚开始n = 1+ 4/(2*3*4) #n=1时- 4/(4*5*6) #n=2时+ 4/(6*7*8)#n=3时`
n%2 == 1 表示奇数(想一下为什么?)pi = 3
N = 100
n = 1
while n < N:
if n%2 == 1:
pi = pi + 4/(2*n * (2*n+1) * (2*n+2))
if n%2 == 0:
pi = pi - 4/(2*n * (2*n+1) * (2*n+2))
n = n + 1
print(pi)
试一下 在线Python
2n+1 ,一定要写 2*n +1 (这是典型的人类思维和程序思维之间的差别)
”前门“ 1号,”崇文门“ 2号 ...
地铁2号线的问题显然比1号线要复杂一点,因为它是环线A站 到 B站两个方向都可以达到,我们的程序需要选出最优的路线给乘客
环线最优路径算法start end 输出 fangxiang zou_numstart = '?' #具体执行时填写
start_num = ? #具体执行时填写
end = '?' #具体执行时填写
end_num = ? #具体执行时填写
fangxiang = ''
zou_num = 0
if start_num == end_num:
print("现在出站")
#环线最优路径算法
a = 0
while a < zou_num:
print(fangxiang+'走1站') #一定要4个空格
a = a + 1
环线最优路径算法A,终点BB - A;对照图看一下,比如 A=1 B=5;B-A 为 44 -> -14 ; -16 -> 2 (默认走法和反方向的走法肯定是一正一负,但绝对值的和为18)
总结:假设起始站A,终点B
B-A; 对应路径 (需要计算)默认路径 和 对应路径 看谁最优 (需要计算)绝对值算法 (1是用在对应路径计算,1是用在最后的走几站的计算)
start = '?' #具体执行时填写
start_num = ? #具体执行时填写
end = '?' #具体执行时填写
end_num = ? #具体执行时填写
fangxiang = ''
zou_num = 0
if start_num == end_num:
print("现在出站")
#环线最优路径算法
default = end_num - start_num #默认
jueduizhi = default #默认绝对值
if default < 0:
jueduizhi = -default #默认绝对值
duiying = 18 - jueduizhi #对应的绝对值
if default > 0:
duiying = -duiying #反方向
j1 = default
if defalut <0:
j1 = -default #绝对值1
j2 = duiying
if duiying <0:
j2 = -duiying #绝对值2
zuiyou = 0
if j1 < j2:
zuiyou = default
if j2 < j1:
zuiyou = duiying
if zuiyou > 0:
fangxiang = '右'
zou_num = zuiyou
if zuiyou < 0:
angxiang = '左'
zou_num = -zuiyou
a = 0
while a < zou_num:
print(fangxiang+'走1站') #一定要4个空格
a = a + 1
试一下 在线Python