目标:学习算法的思想,逐步提升自己
开闭原则
定义:Software entities should be open for extension,but closed for modification.
翻译:软件实体对扩展应当是开放的,对修改应当是关闭的。即扩展时不修改或者尽量少修改原有代码,以保证软件系统的稳定性。
实现:
- 识别出系统的可变化和可能可变化的点(做之前先思考)
- 抽象化可变化的点【接口】,并单独实现可变化的点的抽象【接口的实现】
- 系统依赖抽象化【接口】而不是依赖于实现。
- 对实现的路由单独封装,最好以配置的方式提供。(配置不一定是配置文件,可以是代码,但形式一定要简单直观)
- 需要改变功能的时候,只需要提供新的满足抽象化【接口】的实现,并且更改下路由的配置即可
参考文档:
前端和开闭原则
抽象思维
费波那契函数
费波那契问题是,如果它们按照如下规则,兔子的数量是如何从一代到一代的增长:
- 每对发育成熟的兔子每月产下一对新的后代;
- 兔子在出生后的第二个月发育成熟;
- 老兔子不死;
如果在1月引入一对未发育成熟的兔子,那么在年终时将会有多少对兔子?
如果这道题加上,未成熟兔子第二月成熟,第三月生产,才是斐波那契数列。。。1
2
3
4
5
6
7let Fib = n => {
if (n < 2) {
return n;
}else {
return Fib(n-1) + Fib(n-2);
}
};
回文
“回文串”是一个正读和反读都一样的字符串,比如“level”或者“noon”等等就是回文串。
1 | let checkPalindromic = str => { |
二分查找
折半查找,适用于顺序排列的数组,通过改变索引的值,来减少查找范围
1 | let halfSelect = (arr,aim,min,max) => { |
汉诺塔
1 | let hanoi = (n,a,b,c) => { |