两个数找出较小的那个
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//这种方法叫做析构赋值
写完代码时刻想着优化
调用
minOf2([1,2]) //不推荐minOf2.call(null,[1,2]) //推荐,高手用法
JS内置API:Math.min
Math.min(1,2) //1 Math.call(null,1,2) Math.apply(null,[1,2])
关于Math
看起来Math像Object一样是构造函数 实际上Math只是一个普通对象 这是唯一的特例:首字母大写是构造函数
三个数找出最小的那个
举一反三
let minOf3 = ([a,b,c]) => {return minO2([minO2([a,b]), c])}或者let minOf3 = ([a,b,c]) => {return minOf2([a, minO2([b,c])])}
推理
let minOf4 = ([a,b,c,d]) => {return minOf2([a, minOf3([a,b,c])])}
找出最小的那个
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)}}
这就是递归
- 特点
函数不停调用自己,每次调用的参数略有不同
当满足某个简单条件时,则实现一个简单的调用
最终算出结果
- 理解
排序算法
将整数数组从小到大排序
- 思路
递归思路
长度为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)//从numbers里删掉minreturn [min].concat(sort2(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,7,8,9,12]
总结
求最小值
- 2个数
- 3个数
- N个数
排序
- 2个数
- 3个数
- N个数
学到知识
- 数组
- 递归
