2020-04
11

辗转相除法

By xrspook @ 20:51:51 归类于: 扮IT

题目是这样的

Exercise 5: The greatest common divisor (GCD) of a and b is the largest number that divides both of them with no remainder. One way to find the GCD of two numbers is based on the observation that if r is the remainder when a is divided by b, then gcd(a, b) = gcd(b, r). As a base case, we can use gcd(a, 0) = a. Write a function called gcd that takes parameters a and b and returns their greatest common divisor.

为什么从前我学最大公约数的时候就不是用这个方法呢?如果数字很大,这个应该很快吧,以前我们用的是质因数分解法,我一直没用过其它方法。这里用的是辗转相除法,也叫欧几里德算法,估计在外国这是基础算法,否则Excel也不会有GCD(A, B)这个求最大公约数的公式……

深感自己的无知……

1
2
3
4
5
6
7
8
9
10
11
12
def gcd(a, b): # 可以在Excel里用GCD(a, b)函数测试结果
    if b == 0:
        return a 
    else:
        return gcd(b, a%b) # b不断取代a,b不断被a%b取代
a = int(input('a is '))
b = int(input('b is '))
print(gcd(a, b))
# result
# a is 1024
# b is 480
# 32
2020-04
11

到底要做些什么

By xrspook @ 18:18:23 归类于: 烂日记

昨天我在完成Think Python 2的试题的时候,发现了一个非常严重的问题——我不知道那道题到底我在叫做什么!

造成这样,原因有很多方面。首先有可能因为翻译的人只是把单词从英文变成中文,语序没有调整。我不知道,他那样表述,他自己知不知道自己在说些什么,他真的能够根据他自己的描述把习题解答出来吗?我做翻译的时候,如果遇到一些我搞不懂的东西,我会在那里纠结,先是自己纠结,然后是找各种资料,还是不行的话,我会求助于别人。如果这些方法都没能解决问题的时候,可以的话,我会把那一段跳过。跳过这种事只能用在纯文字翻译的时候,视频翻译是根本不可能做到的。我会跟朋友商量出一个我们都觉得可行的方式,把那东西表达出来。有可能那不是作者的原意,但是按照我们的翻译,联系上下文,语义是通的,没有逻辑问题,没有理解缺陷。所以非常有可能看我翻译出来的东西,你会被我的思路带乱了,但非常有可能你察觉不到原来原文是另外一个意思。所以别人看过我的翻译后,觉得那很顺,至于好不好,我不敢包。

我遇到的Think Python 2的翻译不这样。于是就像我之前所描述的那样,我不知道翻译的人知不知道自己在表达些什么。当然,也存在这么一个可能性,翻译的人知道自己在说什么,在他的专业圈圈里,他们的话就是这么讲的。我跟他们不是一路的人,所以他们的脑洞我无法理解。这也就是虽然我们说的是同一种语言,受的也就是那几本教材的教育,但是我们想象出来的东西是不同的。

如果是翻译上的问题,大概我把原文看一看,也就懂了。之所以让我觉得那些东西羞涩难懂的另外原因是数学这种东西我已经放下好久了。虽然我每天都还在用的数学,但并不是那种高端的模式。我想都没想过用简单几句编程语言就能实现那些定理。那些我知道又或者不知道的定理。当我还是学生,仍然必须面对那些东西的时候,我都不知道原来定理是这么定义出来的。虽然我知道那东西怎么用。或者那说的是一种我已经很早就知道的东西,但表述的那个方式刚好跟我一直以来认识的的方式完全不同。情况就像是,虽然我们要到达的是同一个山峰,但是我之前是从南面上的,他们却是从北面上的,我从来都没走过那条路。所以,光从路上的风景,以及登山的难度,我根本想象不出原来那座山就是那座山。但我又知道那座山就是那座山,因为从坐标位置看来,山顶就是我熟悉的那个地方。过去好长时间,编程的时候老师都不会丢出定理,叫我们去实现。通常我遇到的题目是一些隐含着定理,但更多的看上去是现实的应用题。在没有抓手的时候,我莫名地觉得有点慌。

我要冷静沉着去应对。

2020-04
8

为什么会被小海龟折磨

By xrspook @ 8:44:09 归类于: 烂日记

先画一个正方形,然后画一个正多边形,接着画一个圆形,最后画一个圆弧。从思路上说,再简单不过了,但实际上实施起来的时候,我还是花费了一点心思,但这些东西跟之后的用圆弧画出三个花朵比起来,我算是轻而易举就完成了的任务。后来的花朵之所以耗费了好几个小时才终于搞定,倒不是因为问题本身有多难,而是因为其实我没想通那些数学上的问题。我要画一朵花,花是由花瓣组成的。我画的那朵花是规则结构。那么画完一个花瓣到下一个花瓣的时候,角度我应该如何确定呢?这个问题很简单,但实际上我却在这里兜了无数个圈。我在那里瞎猜,所以很浪费时间。有无数次,我想直接去看答案了,但是我还是控制住了自己。当我终于画出一朵花,并在里面测试无论花瓣是胖是瘦,是多是少,我都能画出来以后,接下来我考虑的是如何一次性在一个面板上画出三朵花。画出一朵跟一次性画出三朵,其实已经非常接近了,但要怎么实现,还是费了一点心,因为某些函数的应用书上根本没说。我去网上稍微搜了一下,发现直接搬过来,而且是在没有看到例子的时候就搬过来行不通。最终我用了COPY大法,一次性画出了三朵花,虽然花的大小跟要求的有点差别。当我看过答案以后,我觉得这种差别是完全可以理解的。胖瘦跟大小是由他们设定的参数决定的,那些参数我们不可能知道。我只能模拟出个大概比例,要我完全模拟出一模一样是不可能的。

小海龟这个东西是一个画图的玩意,但是那又不像艺术家手里的画笔那样随心所欲。那是编程出来的,编程出来的东西还是有大神可以画出个小猪佩奇,但这些做法正如某些大神能用Excel的单元格画出他们想画的任意东西一样。

玩过成年人常规的编程以后再去搞这个小海龟,我觉得最难的地方在于数据的运用。你该怎么处理那些数据?难就难在那些公式设计上面。我不知道为什么Think Python 2这一章要这么整人,但也正是因为他们把我整得很惨,所以我在函数调用上面的确有了一些思路,而那种感觉是从前老师又或者我自学的课程里从来没接触过的。这些才是最核心的东西!为了让我懂得这个,他们祭出了从来都让我很崩溃的小海龟。

现在回想起来,为什么小学的时候小海龟会那么容易让我崩溃,估计情况跟现在差不多。在解决问题的时候我没有把那个箭头当作是一条数学题,一定程度上我把它当作是一个游戏了,所以当我不可以一口说出答案的时候,我首先开始做的是瞎掰,折腾好长时间以后我才终于静下心来,用脑子去考虑,这到底是怎么回事。所以可能某些东西的实现并不难,但是因为我耗在瞎掰上面的时间太多了,简直把我搞得慌张了,所以我会对那个东西瑟瑟发抖。把大问题解剖下来变成小问题,再逐个击破,我应该能很快的发现我的问题所在。

战胜人生中曾经不敢去面对的,非常有意思。

2020-04
7

阴魂不散的小海龟

By xrspook @ 21:56:27 归类于: 扮IT

LOGO语言小海龟,你为啥阴魂不散啊啊啊啊啊啊啊啊啊啊!!!!!对从前小学3年级的我来说是个噩梦,现在依然是个噩梦!Think Python 2的第四章正是用这个turtle讲故事,想死的心都有了。没有一定英语基础,没有足够强悍的数学基础,怎么可能玩得转小海龟,而且还要空间思维能力。小时候我对这个东西瑟瑟发抖实在太正常了…… 25年后再遇到,我继续纠结得死去活来……

第四章最后的习题1要求画一个堆栈图,不知道他们到底要画些什么,要画到什么程度,mindmanager了一个,画完以后的确对函数的嵌套有点开窍。

习题2要画3朵花,画得我死去活来…… 但总算完全不看答案能画出来,看完答案,得到那些偷偷摸摸设定的参数后能画得跟要求一模一样。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
import turtle, math
def arc(t, r, angle):
    n = 20 # int(2*math.pi*r/4)+3 公式画图太细致太慢,直接赋值加速
    step_length = int(2*math.pi*r)*angle/360/n
    step_angle = angle/n
    t.lt(step_angle/2) # 据说折腾一下角度能消除像素误差?
    polygon(t, step_length, n, step_angle)
    t.rt(step_angle/2)
def polygon(t, length, n, angle):
    for i in range(n):
        t.fd(length)
        t.lt(angle)
def flower(t, p, r, a): # t for turtle, p for petal, r for radius, a for angle
    for i in range(p):
        for i in range(2): # 重复两次画花瓣,两次转向后和初始方向一致,非常重要!!!!!
            arc(t, r, a)
            t.lt(180-a)
        t.lt(360/p)
def move(t, length): # 一个画板画3朵花必须用暗中位移
    t.pu()
    t.fd(length)
    t.pd()
bob = turtle.Turtle()
move(bob, -100)
flower(bob, 7, 60, 60) # 偷偷设定半径和角度,万恶的例子,叫人怎么猜!于是我也直接搬!
move(bob, 100)
flower(bob, 10, 40, 80)
move(bob, 100)
flower(bob, 20, 140, 20)
turtle.mainloop()
2019-11
9

好心累啊

By xrspook @ 23:59:21 归类于: 烂日记

没钱的时候你总要发愁要怎么去赚钱,但是当你明明知道有钱花的时候,你却想不到应该用什么方式把那花掉?我觉得今年的双11对我来说就是这么回事。拼死拼活赚回来的红包却不知道该如何使用。没有这些红包的时候走在大街上,有很多东西想要买,无论是吃的还是不能吃的,但是当有钱可用的时候,又突然间觉得一切都好像无所谓,都不是必需品。如果那只是几块钱的话,你或许还可以忽略不计,但如果那是几十块钱的话,不用显然就太亏了。正常人都会有这种思路,尤其是你已经为了这个奋斗了20天。但实际上,为了这几十块钱的红包,估计你要死掉很多脑细胞,对那些本来就有很多东西要买的人来说,这花掉这几十块钱的红包太容易,不过是更划算而已。但是否那就真的是划算呢?我不知道。因为对平时不怎么了解价格的人来说,便宜和昂贵根本就没有一个度,你在双11这个点购物,其实有些时候黑心商家会把价格提上去然后再一个出满减或者打折降回来,但即便做了那些虚假的减价,实际上价格还是要比平时贵。所以在双11,这个全民考验数学能力的时候,花钱是一门非常高深的学问。我不排除有一些习惯性的学渣在双11会突然智商大爆发,但也有可能一些数学学霸在双11这个问题上其实栽了大跟头都不知道,因为他们可能太过于重视学习或者某些专业技术而忽略了某件物品本身的价值。

对一个完全不知道市场价的人来说,到了超市,他只能选择他需要的货物,但是对一个家庭主妇来说,超市里的每一件商品几乎都标上了很便宜或很贵的标签。在他们眼里,这种标识完全是条件反射的。在双11要家庭主妇们判断这个东西到底划不划算,理论上很简单,但实际上双11这种东西又充满了各种数学学霸才能摸得透的套路。所以在经过了各种满减,各种凑单以后,你是否还能真的算出某个物品的最终价格,能用那个最终价格跟平时的最低价做对比呢?如果你根本算不出那个商家系统最终给你的价格。家庭主妇所有那些条件反射完全作废。

我不知道有没有人系统研究过双11的各种套路,到底程序员是用什么逻辑去做判定的。显然,这么鸡贼的东西他们不会告诉你,因为他们的最终目的是你把东西放进购物车,并且提交订单,最终付款的那个价格实际上要偷偷比你设想的高。如果有人认真研究过他们的各种规则,可能你不会被坑到,但又有多少个用户真的非常仔细地研究过他们的各种规则呢?!而且他们的规则还不是一成不变的,而是每次都处在变动之中。你是否有考虑过,第2件0元跟满两件打5折是一回事呢?如果你没有考虑过这个,当你看到购物车里面的某个价格,你会大吃一惊,但显然,这已经是最简单的套路了。他们用得更多的是第2件半价,所以两件平均起来应该是7.5折。但万一还有满减呢?但万一还有预付定金立减呢?但万一还有88会员打折呢?

我觉得双11对我来说永远都好心累。拿折扣好心累,思考买些什么也好心累。

© 2004 - 2026 我的天 | Theme by xrspook | Power by WordPress