2020-04
10

强大到让我瑟瑟发抖的递归

By xrspook @ 8:41:56 归类于: 烂日记

大学学习C语言的时候,基本上我不会写单独的函数,所有要解决的事都在主函数里搞定了。当时我学过判断和循环,但是,我却从来没学过递归。在解决一些简单事情的时候,循环跟递归,没什么差别。从理解程度来说,我觉得循环更简洁一些,但是,当某个东西像套娃那样一层叠一层,每层里面依然用同样的规则继续套叠,不知道要叠多少层的时候。递归就会展现它无穷的魔力。循环难以实现这个,又或者循环并非实现不了,但是递归在完全不需要体现循环的框架下,简洁的语言就已经在做着循环的事情。

昨天,我第一次在Python里见到这个恐怖的递归。外国人的书,我觉得都有一个特点。正文的时候举的例子都很简单,但是一到习题,就会把你彻底搞死。习题里面会偷偷带入一些超纲的东西。大概写书的人理所当然默认你应该知晓。这种事情我已经在学习Java的时候领略过。当时那本书之所以没法看下去,就是因为我没办法想象出作者的脑洞到底是什么。他们的习题几乎可以说大多是一些填空题,但要实现一个功能,其实未必一定就得用某种方法。你给我一个条件,给我一些目标值,我能做出来也就OK了,为啥必须走你的路呢,这非常难。之前我不觉得自己跟外国人的脑洞到底差多远,但是当我对比过自己和他们写的程序以后,我发现真的差挺远的。虽然我们都能实现某个功能,就效率而言,感觉上没差多少,因为我只是在做一些非常初级的东西。应试教育的时候,有标准答案,当然好判定成绩,但实际上,编程这种东西真心应该天马行空。给我一个效率的限制,比如说完成某件事,必须在多长时间之内解决,代码长度不能多于多少,至于我用什么办法,这是我的事。

说回递归函数这件事,在处理几个简单数字的时候,可能你感觉不到它的强大,但是,当我见识过用那个东西画出来的层级图形以后,我简直就只有站在旁边瑟瑟发抖的份儿。真的不知道是哪个神经质想出来这么强大的东西。但实际上,深究下去,那也不是很强大,那不过是不断地重复一些已经设计好的事情而已。如果要人去做那些重复,一开始还好,但是随着事情的深入,会慢慢乱套,但是计算机不会,他们会一根筋地执行我们的指令。最终出来的结果是令人惊叹的优雅,还是乱七八糟一坨屎:就得看设定规律的人的功力了。

递归现在对我来说是一个非常恐怖的东西。因为我不了解它,所以我害怕它,就像当年认识循环一样。但是,用好递归以后,我的武器库里就会增加一个杀伤性非常大的家伙。说到递归,让我联想起新冠病毒。这个东西的递归到底什么时候才是个头?我觉得这肯定不是一个死循环,自然界非常擅长递归,处处都是数学和逻辑你知道吗?!但是,到底要递归多少次,全人类才最终能看到隧道尽头的曙光呢?到底这个新冠病毒函数的递归里埋伏了多少个随机数呢?学习递归让我明白到,层级少好对付,层级一旦扩增,那就是次数级的增长,而且,说不准到达一定层级的以后就会触发某些大招炸弹,想想都心寒。

编程是一个让我重新理解自然规律的过程。

2020-04
8

为什么会被小海龟折磨

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

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

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

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

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

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

2019-07
16

看书自学,提升技能

By xrspook @ 8:58:29 归类于: 烂日记

第一次接触O’REILLY的head first系列的Java书本。已经不记得那本书我是从哪里买的了。当时我想学Java,网上的教程说那本书很不错,于是我就买回来了。不知道是那本书太高端了,还是我太低端,一开始的时候挺爽,但看着看着我就觉得自己跟不上那个进度。虽然我已经觉得自己非常努力,但是那些叫我动脑筋的练习题我几乎回答不出来。如果不看答案,那是想到天荒地老估计都得不出答案。看那本书需要具备相当优秀的逻辑水平,现在回想起来,那不过是用判断和循环不断搭配而已。在冥思苦想用Excel VBA出了一些小程序满足我的日常需要以后,现在倒过来看,觉得head,first那本书的Java题目,的确有难度,但却不至于让我落入到当年那种困苦的程度。当年因为觉得自己实在无药可救,所以我换了一本入门的书。因为第一本高端,换的那本低端一点,所以看第二本的时候我有种豁然开朗的感觉,前面的部分几乎可以一目十行地飞快前进。但到达一定程度,我就没看下去了,因为当时刚好碰上我换了份工作,所以很多时间需要用在重新上手上,我再没有那么多时间去继续自己的兴趣了。因为工作迫切需要我提升Excel技能。于是Java那本低端一点的书我没继续看下去,取而代之我开始Excel三剑客,它们分别是数据透视表,函数,以及VBA。

我首先看完的是数据透视表,函数看了一部分,VBA现在算是看完了。个人感觉数据透视表那本是我看得最酣畅淋漓的,我从中学到了很多,但具体你要我一个部分一个部分介绍,我说不出来,但是你给我份工作,我可以融会贯通。我买回来的那套书基于的是Excel 2013,当时我是用2003边看边实操,很多功能都做不到。现在我用的是Office 365,对应的版本应该是Excel 2019,2019和2013比起来,又多了一些高端的功能,从前那些只是试验性质的东西现在已经成为了2019的标配。在数据透视表方面,的确可以使用一些高端的功能了,但是要完成我的日常工作,通常来说,用2003的层次就可以了。接下来我看的那本是Excel的函数公式,这本书我只看的很少的一部分,因为我觉得与其说那本书是用来看的,不如说那本书是一本手册,是当你有困惑的时候去查阅的。因为里面的内容实在太多。普通人也不可能把所有函数的应用都了如指掌。对我来说,处理数据我最熟手的招数是数据透视表。函数部分有一些我知道它能实现某些功能,但具体要怎么折腾,需要试验一下。我觉得函数和数据透视表虽然有些东西二者都可以实现,但在数据汇总计算方面,数据透视表显然人性化很多。但是数据透视表很难进行数据进行提取,又或者把无序的东西归一。函数高手估计可以实现所有数据透视表的功能。如果把函数比作英语等级考试,估计能做到那个的人已经到达专八以上了,而对一般人来说,四级已经不容易。我觉得自己在函数方面,不过是中等的四级水平而已,而且是还没到可以参加口语考试的那种。之所以我没有非常努力地去学习函数,是因为暂时我还没有需要非常努力的动力。

还有很多东西很好玩,我想接触,我想学习。我觉得在外人眼里,貌似不成章法却能很好解决问题的,是最高的境界。那估计就是《笑傲江湖》里,独孤九剑的精髓——无招胜有招,但实际上那又不是真正的无招,因为招数已经和身体融为一体,到达了随心所欲的层次。

2018-04
20

Office 2016的烦心事

By xrspook @ 9:04:36 归类于: 烂日记

前天下午开始,我就在旧电脑上测试使用Office 2016。之前我已经在那台机上试过用2013,但是因为2013那个明显的漏洞我无法接受,所以即便我在办公的电脑以及家里的电脑装上了,还是把那果断删掉。现在回想起来,当时是有点太紧张,因为测试的时间还很短,对我来说,电脑能不能装2013是最重要的,但我却没有料想到,2013装上去以后,某些对我来说非常重要的功能存在严重缺陷。2013数据透视表的问题依然传递给了2016,但这次之所以我敢去测试,是因为我大概已经知道了解决方法。所以在旧机子上装上2016以后,我赶紧试试一下那些方法可不可行。那个严重缺陷是当你从旧版本2003的xls文件另存为2007开始用的新格式xlsx以后。数据透视表引用的源数据地址会默认乱套。从新建的那个新文件开始,默认数据透视表引用的地址会变成了一个绝对地址。这样,会让人非常崩溃,因为这就意味着当你把文件复制,所有透视表都失效,你无法在上面更新数据刷新效果。在桌面复制的文件存在问题,云同步的也存在问题,但如果你打开软件之后用里面的另存为就没有问题。这个问题在2013之前的版本2010上没有发生过。据说明年就会出2019了,我觉得即便到了2019,问题依然会存在,因为一定程度上他们的工程师已经放弃了对旧版本xls文件的支持,当然不会掏心掏肺地在那里花时间。经过那一次以后,我认真查找了有什么解决办法。首先第一步是开始使用之前就把2016的模板文件替换掉。也说不准是不是模板文件的问题。反正我就真的是一装完以后就马上替换掉。替换掉以后,可能在新软件下生成的数据透视表没问题,但是从旧文件另存为的文件还是有问题。所以解决办法是新建一个文件,然后从旧文件里全选所有工作表,复制到新的文件里。这样操作新文件里面的数据透视表指向的地址肯定是错的,你得把全部改一遍。改完以后,这个文件就算是适应了2016,往后无论是另存为还是桌面复制都不会存在任何问题。为什么要进行这种傻瓜操作呢?这跟另存为有什么不一样吗?作为一个纯粹的软件使用者,我搞不懂。我也试过把旧文件另存为以后在新文件里把数据源全部改一遍,但这样依然不行。虽然麻烦,但总算找到了解决这个很让我头痛的问题的方案。

之所以用2016,而不是2013,其中一个很重要的原因是2016里新增了几个数据图,比如树状图、旭日图、直方图以及箱式图,还有就是Power系列已经是2016的一部分,不需要额外加载。2016能插入地图。虽然能插入,但是可能在功能选择上会比用Office 365更新出来的2016功能少。同样叫做Office 2016,但是Office 365的2016就要比买断版的2016的内容要丰富。我既然已经买下了2016这个版本的使用权,为什么升级的时候我不能使用那些功能呢?!除非你又出了一个2019,然后Office 365更新的是2019,那么2016用不了那些功能我认。

2013的破解虽然有些可以有些不可以,但总体来说还比较顺利,但2016的破解,貌似我没找到一个可以永久的方法,如果用KMS软件,每180天还要重新激活一遍,显然这很烦。因为说不准那个软件哪一天就不小心被杀毒软件干掉了。其实,就个人而言,入手家庭版的2016价位是可以接受的,但问题是我要在家里也要在单位办公室的电脑上操作,总不可能叫我买两台电脑的使用权吧。我付家里那台电脑的钱是理所当然的,但是如果单位这台电脑的也要我付,我就觉得心理很不平衡了。就个人用户而言,不开票也不用其它什么手续,价格只要149,但是如果什么手续都要办全以后,可能价格就要到599。价格相差了一大截。但是如果没有那些手续,单位的软件根本没办法报销。所以最终,如果硬要用这个软件的话,可能单位的人会让我用那个180天要重新激活一遍的破解版。以前破解出来的Office软件没有180天这个限制,但现在2016都这样了,我不觉得2019还会有什么新进展。而且如果2019出了,大家破解的力度就不会在2016上,所以更加不可能突破这个180天的限制。说真的,如果这个软件是好用的话,我愿意去掏那一百多块钱。

32位的2016在32位的Win7 2GB内存的系统下运行比较卡,文件打开的时候比较卡,操作的时候也有可能会卡。我觉得如果装内存8GB的Win7 64位系统上应该没问题,但如果装在内存4GB的32位Win7上很难说。如果我用上了2016以后,我那XP的上网本,就不可能编辑到新文件的新增功能了。不过话说回来,对我来说那些新增功能的使用几率其实不算很高。所以既然使用几率不高,为什么我非得换一个版本呢?如果我只是喜欢2016的图,我完全可以在我有需要的时候用某台电脑去做图,虽然这样挺麻烦。2016有一些新增的公式,虽然我很想用那些功能,但不嫌麻烦用以前通用的公式各种迂回还是能做到同样的效果。

以前电脑上换某个软件的时候根本没有这么多烦恼,只管用就是了,但现在要照顾的东西太多。

2017-09
21

Excel的取舍函数

By xrspook @ 10:26:27 归类于: 烂日记

学功夫是一回事,把功夫活学活用,又是另外一回事。还是学生的时候,我觉得自己的Word用得还过得去,但是那个时候显然我完全不懂什么邮件合并,后来我觉得,在实际工作中,邮件合并比Word的其他功能我用得更多。大学要写各种实验报告和论文的时候我不得不接触。工作以后更加是和Excel朝夕相对,一直以来我都觉得自己的Excel公式用得还可以。起码最基本的功能,我都可以做到。大概是因为我用Excel的范围还很少,所以还不曾需要用到一些很高端的东西。昨天我的三本Excel武功秘籍终于到了。亚马逊现在用的快递公司是从前凡客的如风达。前天早上8点多我就已经看到他们把我的订单分配给了快递员并开始配送,但实际上前天一整天都没来,到昨天早上,他终于给我打了个无法听清他在说什么的电话,大概是因为信号不好,接着我就收到短信说我的东西到了。这般三本书真的很厚重。尤其是那本《Excel 2013函数与公式应用大全》以及那本《Excel 2013数据透视表大全》。两本书的定价都是99块钱。余下的那本是讲VBA脚本的。VBA这种东西,我必定要学会,但是那可以缓一缓。从前我觉得自己的函数还过得去,但是,但我当我拿起那本很厚重的武功秘籍翻一翻的时候,我才知道自己有多么的渺小,自己所知道的只是皮毛中的皮毛。之前工作一直都没什么阻碍是因为我涉及的东西实在太少。

就以取舍数据为例,有四舍五入的,有向上向下舍去了。我们平时用得最多的只是针对小数点的ROUND函数。到昨天为止,我才知道原来那个控制函数还可以用负数,复数就等于是十百千万位等等。这些只是整十整十取舍的,还有一些是基于任何基数的。你可以把那个基数设为0.01,你也可以把那个基数设为300。这些都非常自由,想怎么整就怎么整。从前我认识的取整函数就只有一个INT,但昨天我又认识了另外一个TRUNC,而且那个TRUNC,比我之前学的那个INT还要厉害,更适合取整这个概念,而且那个TRUNC还可以针对小数位,于是当然也可以包括控制十百千万位。在一定范围内取整函数和舍入舍出函数是一致的。在正数的时候,取整函数跟向下舍入函数一致,在负数的时候,取整函数跟向上取整函数一致。这种向上向下,他们通常的解释方法是绝对值,即离零远一点还是近一点。其实说白了,这就是一个绝对值大小的问题。向上舍入的函数绝对值会离零越来越远,而向下舍入的函数最终的结果是离零越来越近。要搞清这种关系,首先,你都要知道,你的想做到什么。然后才好说要用什么函数去实现。如果,你需要处理的数据只是一个正数,而且需要取舍的位置只是很普通的,只要求十百千万位,起码有三个函数,能满足你的需要,即TRUNC、ROUNDDOWN和FLOOR,这些函数一个人控制数就能搞定,不需要再自己手动添加些什么。当你不懂得这些函数的时候,当你只懂一两个函数的时候,你还得用很笨的方法去进行取舍。当然,这些取舍函数很多是高级货,在Excel 2003里,你需要加载数据分析库才可以用,但是如果你用的是更高端的Excel,比如说2013,就没必要去做这种操作。2013比2003强大,很多是它的函数控制更加具体,不容易犯错,同时它的数据透视表也更强大,这些只是我暂时观察到的,估计随着学习的深入我会发现更多秘籍。

学习从来都是个无底洞。

归档:2017-09-21 罪念

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