逻辑思维
第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 #和为0
b = 1
while 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_num
start = '?' #具体执行时填写
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
,终点B
B - 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