两数中找出较小的那个
代码
var 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(null,[1,2])//推荐这种写法
使用现成的API
JS 内置了 Math.min
调用方法:
Math.min(1,2)//1Math.min.call(null,1,2)Math.min.apply(null,[1,2])
关于Math
- 看起来 Math像 Object一样是构造函数
- 实际上Math只是一个普通对象
- 这是唯一的特例:首字母大写是构造函数
三数中找出最小的那个
let minOf3 = ([a,b,c]) => {return minOf2([minOf2[a,b],c])}
或者
let minOf3 = ([a,b,c]) => {return minOf2([a, minOf2([b,c])])}
推理:
let minOf4 = ([a,b,c,d]) => {return minOf2([a, minOf3([b,c,d])])}
找出最小的那个
递归:
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 = (numbers) => {let index = minIndex(numbers)let min = numbers[index]numbers.splice(index,1)return [min].concat(sort2(numbers))}
minIndex
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()}}
思路:
- 找到最小数的索引
- 索引对应的值
- 删除最小值
- 对剩下的部分重复前面步骤
选择排序的循环写法(时间复杂度n^2)
将 minIndex 用循环写
let minIndex = (numbers) => {let index = 0for(let i = 1; i<numbers.length; i++){if(numbers[i]<numbers[index]){index = i}}return index}
所有递归都可以改写成循环
把 sort 用循环写
思路:
每次在数组中找到最小的数放在前面,然后对后面的数做重复的事情
比如:
[3,5,2,1]
先找1,然后把1跟3换位置 => [1] + [5,2,3]
然后在 [5,2,3] 中找最小数 2 ,然后跟5换位置 => [1,2] + [5,3]
然后在 [5,3] 中找最小数 3,然后跟5 换位置 => [1,2,3] + [5]
let sort = (numbers) => {for(let i = 0; i < numbers.length; i++){let index = minIndex(numbers.slice(i)) + iif(index !== i){swap(numbers, index, i)//交换index,i 对应值的位置}}return numbers}
let swap = (array, i, j) => {let temp = array[i]array[i] = array[j]array[j] = temp}
