抽象能力
学习到现在为什么可以理解每一行代码,但是代码和到一起之后就看不懂了?
function t(fn, delay){ //声明t,有两个fn, delay的参数
let fn2 = ()=>{ //声明fn2
if(fn2.timer){return} //如果fn2.timer存在,就return fn()及之后的语句
fn() //执行fn()
fn2.timer = setTimeout(()=>{ //fn2.timer等于'等一会执行的'null
fn2.timer = null //null赋值与fn2.timer
},delay) //delay是'等一会执行的时间确定'
} return fn2 //上面所有代码运行完后,函数t(),return出fn2
}
let f = t(()=>{console.log('火球术')},5000)
- 问:上面的代码,每一行都可以看懂,为什么合到一起就不行了???
- 因为缺少抽象能力
抽象能力到底是什么?
不变应万变变
Java.js.Python.PHP这些编程语言真正共有的到底是什么?
- 声明
- if...while..
- while循环,for循环
- 函数
- 对象
- 上面这些是所有语言的共有的
- 这些意味着学习编程首先就是要理解这些语言的不变之处
- 不变应万变
- 不必过分深究细节
编程世界中什么东西到底是亘古不变的呢?
1.对编程的由衷热爱
- 拥有自律的习惯
- 写博客及时总结
- 定目标边写边学
- 简洁之美
- 用简单的代码实现多种问题
- 构建自己的编程世界
2. 逻辑
-
三段论逻辑
语句1:JS的函数有Function构造的 语句2:JS中Object.Array.Function是函数 推论:JS中Object.Array.Function都是由Function构造的
- 逻辑是要学习的,有时候逻辑是反直觉的
- 代码是可以表示逻辑的
- 逻辑是要学习的,有时候逻辑是反直觉的
-
if...else..
代码表示逻辑- 比较两个数大小:如果第1个数大于第2个数,就输出第1个数,否则输出第2个数
- 伪代码↓
a = [12,32] if a.get[0]>a.get.[1] //a获取的第0个元素与a获取的第一个元素想比较 print a.get[0] else print a.get[1]
-
for
循环表示逻辑- 输出N个数中最大的一个数
- 第一找到第1、2个数字中较大的那一个,存入max
- 第二找到max和第3个数字中较大的那个,存入max
- 第三找到max和第n个数比较,存入max
- max就是最大的数
- 伪代码↓
a = [23,12,45,78,25,65] max = a[0] //从a中拿第0个元素'23' for i from 1 to a.length()-1 //数组下标从1开始变至数组的结尾 //因为前面已经拿了第0个元素了,所以要减1 //所以要拿1和0元素比较 if a.get(i)>max then max = a.get(i) // 比较开始然后重复循环 print max //存入最大的数
流程图如下:↓
-
从上图中可以看出代码可以表示逻辑(注意上图中的代码全部都是伪代码)
3. 数据结构
- 数据结构就是:数据与数据之间的关系(非常抽象)
- 想要精准的了解数据结构那么必须了解八大算法
如何表示两个数据
- 如果顺序有意义
- [x, y]表示第一个是x,第二个是y
- [y,x]表示第一个是y,第二个是x
- 比如坐标就是这样的数据
- 要提供first和last操作
- 如果顺序无意义
- (x, y)和(y, x)一样
- 比如血压值(120, 80)和(80, 120)没区别不需要提供first和last操作
如何表示N个数据
- 如果顺序有意义
- 数组表示[a1, a2,... aN]
- 要提供索引操作get(i)
- 要提供add/indexOf / delete操作
- 如果顺序没有意义
- 集合表示fa1, a2, ...aN]
- 今天所有的代码都跟JS无关要提供add / delete / has操作
如何表示N对N数据
- 比如学号
- 用「哈希表」表示
- ash={1001->小方,1002->'小红}}
面试题
- 有一段英文对白,里面只会出现a-zA-Z、标点符号和空格,请告诉我每个字符出现的次数
- 例如Hi, I'm Frank
- 输出a出现1次, F出现1次, H出现1次...
- 答:用哈希表做
- 伪代码↓
str = `HI,I'm Frank` //声明这个字符串
hash = { } // 建立一个空对象
for i from 0 to str.length-1 //下标从0至字符长度减1
key = str.get(i)
value = hash.get(key,0)+1 //因为第一次是空的,所以伪代码规定空加1为1
hash.set(key,value)
for key,value from hash
print `${key}出现了${value}次`
-
数据结构=数据形式+操作
- 不同形式的数据暴露不同的操作
-
数据结构的作用
- 提前记住一些结构
- 这些结构很常见
- 这些结构能让你很快理清思路这些结构面试经常问 、
- 锻炼你的抽象能力
- 一种数据结构往往能解决很多类似的问题
- 如果你选错了数据结构,你根本就想不出思路牛逼的程序员更重视数据结构,而不是算法
- 提前记住一些结构
总结
- 逻辑很重要
- 用三种语句表达逻辑
- 用图和伪代码表示三种语句
- 数据结构一定要经常使用