求2个数中的最小值
必备知识
了解使用哪种数据结构,使用数组,表示[a,b]两个数字
结合编程知识
使用问号冒号表达式a>b? true : false简化代码
代码
实例1:使用if..else
let minOf2 = (numbers) =>{
if(numbres[0] < numbers[1]){
return numbers[0]
}else{
return numbers[1]
}
}
实例2:继续简化,使用问号冒号表达式 这种写法也称为析构赋值
let minOf2 = ([a,b]) => a < b ? a : b
不同的调用方法
minOf2([1,2])// 普通的调用法minOf2.call(null,[1,2])// 高级的调用法
JS的API
Math.min
Math.min(1,2)Math.min.call(null,1,2)Math.min.call(null,[1,2])
关于Math
- 通常来说,首字母大写就是构造函数,这是唯一的特例
Math只是普通对象,不是构造函数
求3个数中的最小值
使用minOf2方法可以得到任意长度数组的最小值
代码
实例1:
let minOf3 = ([a,b,c])=>{
return minOf2([minOf2([a,b]), c])
}
实例2: 使用minOf3在四个数中找到最小数
let minOf4 = ([a,b,c,d]) =>{
return minOf2([a,minOf3([b,c,d])])
}
求N个数中的最小值
必备知识-递归
递归特点
- 函数不停的调用自己,每次调用后参数略有不同
- 当满足某个简单的条件后,实现一个简单的调用
- 最终返回一个结果
理解递归
- 使用代入法理解递归, 输入实际参数
- 使用调用栈理解递归
代码
实例1:这个代码会死循环,需要一个终止循环的条件
let min = (numbers) =>{
return min([numbers[0], min(numbers.slice(1))
)
}
实例2: 递归
let min = (numbers) =>{
if(numbers.length > 2){
return min([numbers[0], min(numbers.slice(1))
)
}else{
retutn Math.min.apply(null, numbers)
}
}
2个数的排序
必备思路: 使用递归 + 循环来实现
代码
实例1:
let sort2 = ([]) =>{
if(a < b){
return [a,b]
}else{
return [b,a]
}
}
实例2:优化代码
let sort2 = ([a,b])=> a < b ? [a,b] : [b,a]
实例3:寻找最小值的索引
let minIndex = (numbers) => numbers.indexOf(min(numbers))
3个数的排序
代码
实例1:问题在于无法将最小的值从数组中删除,sort2支持两个数的排序
let sort3 = ([a,b,c]) =>{
return[min([a,b,c]),sort2([???])]
}
实例2:
let sort3 = (numbers) =>{
let index = minIndex(numbers)
let min = numbers[index]
// 在 numbers 里删除 min
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)
}
N个数的排序
实例1:死循环
let sort = (numbers) =>{
let index = minIndex(numbers)
let min = numbers[index]
numbers.splice(index,1)
return [min].concat(sort(numbers)
}
实例2:使用代入法,代入[12,5,8,7,9]查看过程
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()
}
}
完整代码:
let min = (numbers) =>{
if(numbers.length > 2){
return min(
[numbers[0], min(numbers.slice(1))])
}else{
return Math.min.apply(null, numbers)
}
}
let minIndex = (numbers) => {
return 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()
}
}
console.log(sort([7,5,4,6,8,9,3,2,1]))
console.log调试
console.log(`min:${min}`)