所有的递归都可以改写成循环
递归需要return
function fn(n){
console.log(n)
if(n===0){
return 0
}
else{
fn(n-1)+1
}
}
fn(3)

- 不return的话,压在调用栈中的函数无法一层一层往上给值
用递归对一个不定长数组求最小值
- 递归就是先递进再回归
- 只有不断地调用自身函数才叫递归
- 递进到一个终点才开始执行之前待执行的
function min(...arr){
console.log(arr.length);
if(arr.length===2){
let minNumber=Math.min.apply(null,arr);
return minNumber
}else{
return min(arr[0],min(...arr.slice(1)));
}
}
min(1,2,3,4,5,6,7)
function min(arr){
if(arr.length===2){
let minNumber=Math.min.apply(null,arr);
return minNumber
}else{
return min([arr[0],min(arr.slice(1))]);
}
}
min([1,2,3,4,5,6,7])
用递归写sort 结果由小到大(选择排序法)
function sort2([a,b]){
return a>b?[b,a]:[a,b];
}
function minIndex(arr){
return arr.indexOf(Math.min.apply(null,arr))
}
function sort3([a,b,c]){
let arr=[a,b,c];
let i = minIndex([a,b,c])
let minResult=arr.splice(i,1)
let result=minResult.concat(sort2(arr))
return result
}
sort3([3,2,1])
function sort4([a,b,c,d]){
let arr=[a,b,c,d];
let i = minIndex([a,b,c,d])
let minResult=arr.splice(i,1)
let result=minResult.concat(sort3(arr))
return result
}
function minIndex(arr){
return arr.indexOf(Math.min.apply(null,arr))
}
function sort2([a,b]){
return a>b?[b,a]:[a,b];
}
function sort(arr){
if(arr.length===2){
return sort2(arr)
}else{
let i = minIndex(arr)
let minResult=arr.splice(i,1)
let result=minResult.concat(sort(arr))
return result
}
}
sort([5,2,1,3])

队列FIFO
餐厅叫号demo先拿号的先用餐
栈 LIFO
- 坐直达电梯
- 调用栈 call stack

链表 linked list
- JS的每个对象都有原型链 这其实就是链表
- 最简单的链表是单项链表,一直往下就行
- 还可以是双向链表
- 还可以是循环链表,最后一个节点指向头
这是个不严谨的有bug的链表操作
哈希表

树
