如何找到两个数字中较小的那一个?
- 必备知识
- 用数组[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 =([1,2]) => a<b ? a : b
- 这种写法叫做析构赋值,之后课程会反复使用
- 调用
- minof2([1,2]) //1 这是小白调用法
- minof2.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 只是一个普通对象
- 这是唯一的特例: 首字母大写是构造函数
三个数找出最小的那个
- 代码
- let min0f3 =([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])])
} - 任意长度数组最小值,都可以通过 minof2 实现
找出最小那个
- 代码
- 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)
}
}
这就是递归
![be53f25cdcd3a855f73464b04ac68401.png](https://i-blog.csdnimg.cn/blog_migrate/13790cd40d3bddd3c146c4afb8aee983.jpeg)
递归
- 特点
- 函数不停调用自己,每次调用的参数略有不同
- 当满足某个简单条件是,则实现一个简单的调用
- 最终随处结果
- 理解
- 可以用带入法快速理解递归
- 可以用调用栈快速理解递归
排序算法
- 思路
- 用递归现实
- 用循环实现
递归思路---选择排序
长度为2的数组排序
- 代码
- let sort2 =([a,b]) => {
if(a < b) {
return [a,b]
}else{
return [b,a]
}
} - 上面的[a,b]和[a,b] 是同一个数组吗? 答:是不同的数组
- 优化代码
- let sort 2 = ([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([a,b,c]) - let min = numbers [index]
- numbers.splice(index,1)
- // 从 numbers 里删掉 min
- return [min].concat(sort2(numbers))
}
长度为4的数组排序
- 代码
- let sort4 =(numbers) => {
let index = minIndex(numbers)
let min =numbers[index,1]
return [min]. concat(sort3(numbers))
推广 -----任意长度的数组排序 - 代码
- let sort =(numbers) => {
let index = minIndex(numbers)
let min = numbers[index]
numbers.splice(index,1)
return [min].concat(sort(numbers))
}
死循环......
需要在2的时候断掉
- 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.reverse()
}
}
用代入法 sort([12,5,8,7,9])
![5a175868fd259dbf8edd6e2301927985.png](https://i-blog.csdnimg.cn/blog_migrate/b731ea4ea8c34ee14e33ca40d12efa66.jpeg)
console.log 调试
![c1deeac3ba71cef60156a4ceb58537b4.png](https://i-blog.csdnimg.cn/blog_migrate/816d8e6fd74e41880bf3a88143c3d2dd.png)
总结:
- 求最小值
- 2个数
- 3个数
- N个数
- 排序
- 2个数
- 3个数
- N个数
- 用到的东西
- 数组(数据结构)
- 递归