算法入门1

199 阅读2分钟

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])])
}
  • 任意长度数组求最小值,都可以通过minOf2实现

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)
 }
}
  • 这就是递归

递归

  • 特点:
  • 函数不停调用自己,每次调用的参数略有不同
  • 当满足某个简单条件时,则实现一个简单的调用
  • 最终算出结果
  • 理解:
  • 可以用代入法快速理解递归

1.jpg

  • 可以用调用栈快速理解递归

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)
 //从numbers里删掉min
 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])的过程

1.jpg

5.如何调试代码

  • 代码会错
  • 用console.log调试