如何理解递归
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
//这种写法叫析构赋值
现成的 API, JS 内置了 Math 对象 Math.min
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) => {
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)
}
}
//这就是递归
- 用代入法理解递归
- 举例:numbers [ 12, 5, 9, 66, 33, 55]
- 函数不停调用自己,每次调用的参数略有不同 – 递进
min([12, min([5,9,66,33,55])])
min([12, min([5, min([9,66,33,55])])])
min([12, min([5, min([9,min([66,33,55])])])])
- 当达到中止条件,
else
部分,实现一个简单的调用 Math.min
– 回归
- 最终算出结果
5
min([12, min([5, min([9,min([66,Math.min([33,55])])])])])
min([12, min([5, min([9,Math.min([66,33])])])])
min([12, min([5, Math.min([9,33])])])
min([12, Math.min([5, 9])])
Math.min([12, 5])
5