吴军老师的《计算之魂》部分重点摘要

递推 vs 递归

递推

我们都熟知的正向思维,从前往后、从小到大、由易到难、由局部到整体
比如5的阶乘,要从小到大一个个乘起来,即 5!= 1 × 2 × 3 × 4 × 5

这种计算思维是我们从小学到初中,到高中一直培养的习惯,甚至到现在的编程算法,我们大部分人也是运用这种思维来解决问题,比如大家面试经常遇到的问题,要求编写一个斐波那契函数f(n),计算给定 n 的函数值


递归

递归属于逆向思维,需要倒过来思考问题,从大到小、由整体到局部的思维,例如上面求 5 的阶乘,先假定4!是已知的,然后再乘以 5 即可。当然,大家会问,那 4! 怎么计算呢? 很简单,采用同样的方法,3!× 4,只要计算出 3!乘以 4 即可。同样的方法,来计算 3!,直到最后的 1!,我们知道它就等于 1 。接下来,就是倒推回所有的结果,从 1!、2!一直倒推回 5!

递归的思想有两个明显的妙处:
1、只要解决当前一步的问题,就能解决全部的问题
2、复制同一个过程,就能得到结果

要把问题通过递归的细想来解决,必须满足两个前提条件:
1、每一个问题在形式上都是相同的,否则无法通过同一个过程完成不同阶段的计算(也就是必须要满足过程可复制)
2、必须确定好结束条件,否则就像 “从前有座山” 那个故事里的情节,永远无法结束

吴军老师的原话:很多人在学计算课程时非常不喜欢递归这种不直观的逆向思维,觉得像阶乘运算这种从小到大一个个相乘就可以了,何必那么复杂地倒着计算呢?原因很简单,很多问题只有倒着才能想清楚。这一关如果过不了,在计算机领域做一辈子技术也出不了师

小编见解:递归的思维,用到的地方其实很多,比如,数据分析里面,我们正着去分析可能就不通,但我们反向去思考可能就解决了


信息编码的重要性

计算机中的所有内容都是以二进制进行编码的,比如看到的文字,在硬盘、内存、网络传输时中都是以编码形式存储的,如我们熟悉的UTF-8编码,还有最开始学计算机编程时了解的ASCII (American Standard Code for Information Interchange) 等,都是编码在计算机中的应用。信息的编码和有效表示是计算机科学和工程的基础,所以我们要理解这些基础的原理,这样有助于我们深入了解计算机。

当然,二进制编码对于人类来讲很不直观,便产生了很多便于人类辨识的等价代码,比如在MIPS处理器中,用 001000 代表加法运算,如果这样写程序几乎没有人能记住,出错也很难以检查,于是人们就将 ADD 这三个字母和 001000 这条代码对应起来。

下面以书中的案例,来更深入的向大家介绍编码的重要性,这道题 吴军老师说也是面试题,大家不妨把自己当作面试者,也一起思考下怎么来解答

案例—分割黄金问题:
泰勒是一位雇主,雇用鲍尼为自己新建的房子铺设院子里的地砖,这是一个七天工作量的活。泰勒答应一共支付一根金条作为报酬,但是鲍尼每天支付他 1/7 的工资,泰勒答应了。现在,请问你如何在金条上切两刀,保证每天正好能支付鲍尼 1/7 的工资?

(思考2分钟,再往下看)

小编看了这道题也没有想出来怎么切分,但看了答案感觉确实妙不可言,里面巧妙的运用了编码的思想,下面就给出答案

在金条的 1/7 的地方切一刀,在 3/7 的地方再切一刀,这样金条就变成了三个小金块,质量分别是 1/7、2/7、4/7 的金条质量。接下来,我们就要用1、2、4 这三个数字表示出 1 ~ 7 这七个数字,具体的表示方法如下:
1 = 1
2 = 2
3 = 2 + 1
4 = 4
5 = 4 + 1
6 = 4 + 2
7 = 4 + 2 + 1

利用上面的公式,在发工资时,泰勒第一天给鲍尼 1/7 金条质量的那一块黄金;第二天给鲍尼 2/7 的那一块,并要求对方交回先前 1/7 的那一块;第三天,再给鲍尼 1/7 的那一块,这样鲍尼就得到了 3/7 金条质量的黄金;第四天,给鲍尼 4/7 的那一块,但是要求他将之前给的那两小块金条交回;…到了第七天,把所有的黄金都给鲍尼即可。

这道题解法的关键是 1、2、4 这三个数字能够表达 1 ~ 7 的所有数字。那为什么 1、2、4可以呢?因为它们分别是二进制的 “个位数”、“十位数”、“百位数”。因为二进制只有 0、1 两个数字,所以每一个进位是 0 或者是 1 的组合,就能表示各种数字。我们不妨再用二进制把前面七个等式重写一遍就一清二楚了(二进制以 0b 开头)
1 = 0b001
2 = 0b010
3 = 0b011 = 0b010 + 0b001
4 = 0b100
5 = 0b101 = 0b100 + 0b001
6 = 0b110 = 0b100 + 0b010
7 = 0b111 = 0b100 + 0b010 + 0b001

通过这道案例题,大家是不是对编码有了更进一步的了解,原来编码这么重要,其实大家在编程时可能已经运用过,只是没有深入思考而已,以下摘自微软开发者文档,文件的操作:
编码



以上是自己实践中遇到的一些问题,分享出来供大家参考学习,欢迎关注微信公众号:DataShare ,不定期分享干货

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
《仙剑奇侠传》之父姚壮宪热情推荐,技术作家孟岩高度评价! 云风也是我在中国最佩服的游戏开发者。看了云风的研发历程,我觉得就是一部中国的游戏程序史,从最早的 Z80 , 6502 , PC8088 , 286 , 386…DOS ,保护模式, Assembler 到 C++ 的整个发展轨迹。这本书可以说横跨了游戏程序的过去、现在和未来。 书中传达的不仅是一些实用的技术经验,更是传达一种理念——虽然研发的环境随着时代而变,但研发的精神是不变的,那就是“在实践中积累”。 ——《仙剑奇侠传》之父 姚壮宪 之前我经常奇怪,云风还非常年轻,他程序思想中的那种老练的智慧是从何处得来的呢?读完这本书之后,我终于明白,还是那句话:“无他,唯手熟耳”。 面对这沉甸甸的作品,我确实感到,这是云风用心写的书。用心写的书,当然出色。 ——技术作家 孟岩 我现在是中国并不成熟的游戏制作行业中的一员,游戏给了我太多,我告诉自己需要做一点事情。分享知识和经验是我的义务,别无它。 ——云风 内容简介 本书忠实地记录了作者十余年来对游戏编程的所思、所感、所悟。全书按照作者本人学习和实践的过程,带着读者从基础的计算机知识到高级的编程技术,从非常专业的汇编优化到非常实际的项目管理进行了一次游戏开发的全景探索。 本书不仅适合游戏开发者阅读,也会给所有的开发者和程序爱好者带来启示。 作者简介 云风,时年二十七岁。自幼学习编程,十数年从未间断,对程序设计有所领悟。大学时代开发的游戏图像引擎“风魂”曾用于多家游戏公司的游戏项目。参与过《大话西游》系列、《梦幻西游》、《网易泡泡游戏》的开发。现从事新一代网络游戏引擎的研究与开发,并在游戏模式上做一些新的尝试。 性格开朗,兴趣广泛,好交友,绝非沉浸在计算机世界中的书呆子。国学、历史书籍常备案头,以先贤之教诲修其心;休息时常作户外运动,尤其喜爱攀岩。 目录 第1章 计算机,游戏,我 1 1.1 计算机 2 1.2 计算机游戏 3 1.3 计算机与我 7 1.3.1 启蒙 7 1.3.2 编程 9 第2章 算法,程序的灵魂 13 2.1 程序=算法+数据结构 14 2.1.1 算法 15 2.1.2 数据结构 17 2.2 搜索算法 23 2.2.1 地图寻路问题 23 2.2.2 博弈问题 27 2.2.3 更为广泛的运用 28 2.3 智能算法 29 2.3.1 遗传算法(Genetic Algorithm) 29 2.3.2 模拟退火算法(Simulated Annealing) 31 2.3.3 禁忌搜索(Tabu Search) 33 2.3.4 人工神经网络 (Artificial Neural Network) 34 2.4 优化 36 2.4.1 质数问题 36 1.4.2 俄罗斯方块竞赛 37 2.5 Apple II上的编程之路 39 第3章 编程语言 45 3.1 C 语言 46 3.2 BASIC 50 3.3 C++ 51 3.4 汇编语言 54 3.4.1 概述 55 3.4.2 程序的本质 57 3.4.3 寄存器 58 3.4.4 寻址方式 60 3.4.5 汇编指令 61 3.4.6 C/C++ 语言和汇编 62 3.4.7 小结 63 3.5 其他语言 63 3.5.1 Forth 63 3.5.2 Lisp 64 3.5.3 Java 64 3.5.4 Python、Lua、更多 65 第4章 前Windows 时代 67 4.1 386保护模式 68 4.2 VGA 到VESA 70 4.2.1 超越 BGI 70 4.2.2 VGA 72 4.2.3 VESA 标准 72 4.2.4 花絮 74 4.3 保护模式下的开发工具 75 4.4 闲话 Allegro 81 4.4.1 用C与汇编写成的程序库 81 4.4.2 BITMAP 82 4.4.3 Sprite 85 4.4.4 几何图形和 3D 89 4.4.5 数据文件 91 4.4.6 声音 92 4.4.7 其他的部分 93 4.4.8 小结 94 4.5 cfido 中国惠多网 94 第5章 Windows 编程 101 5.1 Windows编程入门 104 5.1.1 Windows版本综述 105 5.1.2 操作系统的核心 107 5.1.3 Windows API和DLL 110 5.1.4 COM 111 5.1.5 Windows的窗口和消息处理与传递 114 5.1.6 Windows GDI 125 5.2 控制游戏的速度 130 5.3 浅谈MFC 132 5.4 小结 132 第6章 汇编优化 135 6.1 浅谈代码优化 138 6.2 并不仅仅是汇

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

数据人阿多

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值