1.minOf2的实现
如何找到两个数中较小的那一个
- 必备知识
- 数据结构:用数组[a,b]表示两个数字
- 能想到这一点就说明在使用数据结构
- 编程知识:问号冒号表达式?:
let minOf2 = (numbers)=>{
if(numbers[0]<numbers[1]){
return numbers[0]
}else{
return numbers[1]
}
}
//优化代码
let minOf2 = numbers => //只一个参数括号省 使用问号冒号表达式花括号省
numbers[0]<numbers[1]
?numbers[0]:numbers[1]
let minOf2 = ([a,b])=>a<b?a:b
- numbers拆开结构是数组,依次赋值
- 这种写法叫做析构赋值
调用
minOf2([1,2])//1 这是小白调用法
minOf.call(null,[1,2])//这是高手调用法
现成API
- JS内置了Math.min
- Math.min(1,2) //1
- Math.min.call(null,1,2)
- Math.min.apply(null,[1,2])
关于Math
- 看起来Math像Object一样是构造函数
- 实际上Math只是一个普通对象
- 这是唯一的特例,首字母大写的一般都是构造函数,Math除外
2.minOf4的实现
三个数找出最小的那个
let minOf3 = ([a,b,c])=>{
return minOf2([a,minOf2([b,c])])
}
推广
let minOf4 = ([a,b,c,d])=>{
return minOf2([a,minOf3([b,c,d])])
}
3.min的实现
找出最小的那个
let min = (numbers)=>{
return min(
[numbers[0],min(numbers.slice(1))]
)
}
- 这个代码会死循环不停调用自己,需要添加一个中止条件
let min = (numbers)=>{
if(numbers.length >2){
return min(
[numbers[0],min(numbers.slice(1))]
)
}else{
return Math.min.apply(null,numbers)
}
}
递归
- 特点:
- 函数不停调用自己,每次调用的参数略有不同
- 当满足某个简单条件时,则实现一个简单的调用
- 最终算出结果
- 理解:
- 可以用代入法快速理解递归

4.实现sort排序
升级:将正整数数组从小到大排序
排序算法思路
递归思路:选择排序
将长度为2的数组排序
let sort2 = ([a,b])=>{
if(a<b){
return[a,b]
}else{
return[b,a]
}
}
let sort2 = ([a,b])=>
a<b?[a,b]:[b,a]
将长度为3的数组排序
let sort3 = ([a,b,c])=>{
return [min([a,b,c]),sort2([???])]
}
let sort3 = (numbers)=>{
let index = minIndex(numbers)
let min = numbers[index]
numbers.splice(index,1)
return[min].concat(sort2(numbers))
}
将长度为4的数组排序
let sort4 = (numbers)=>{
let index = minIndex(numbers)
let min = numbers[index]
numbers.splice(index,1)
return[min].concat(sort3(numbers))
}
推广:任意长度的数组排序
let sort4 = (numbers)=>{
let index = minIndex(numbers)
let min = numbers[index]
numbers.splice(index,1)
return[min].concat(sort3(numbers))
}
let minIndex = (numbers)=>numbers.indexOf(min(numbers))
let sort = (numbers)=>{
if(numbers.length>2){
let index = minIndex(numbers)
let min = numbers[index]
numbers.splice(index,1)
return[min].concat(sort(numbers))
}else{
return numbers[0]<numbers[1]?numbers:
numbers.reverse()
}
}
- 原理:每次找到最小的数放前面,然后对后面的数做同样的事情
用代入法看看sort([12,5,8,7,9])的过程

5.如何调试代码