递归的学习! xxxxx
2019-05-16 本文已影响0人
不敢大声说话的web小萌新
递归学习
-
实现一个输入方法,fun(n) 打印n 直至到n = 0
function fun(n){ if(n===1){ return console.log(n) } console.log(n); fun(n-1); }
-
实现一个递加函数 fun(n),例如 n = 3 ; 1+2+3的结果
function fun(n){ if(n === 1){ return 1 } return n+fun(n-1); } //尾调优化 尾调--> //当函数执行时创建执行栈,上面的代码如果执行5计算的时候 //那么call task 就会在同一个执行栈 分别调用5 生成 4 调用 4 生产 3 一直到调用到1 然后再返回执行 //尾调优化就是解决压栈问题 - 让他自身再一个内执行,返回一个函数,不是表达式 function fn(n,total){ if(n === 1){ return total }; return fun(n-1,n + total); } //我们可以做一个console.time() console.timeEnd() 来测试优化 console.time(); fun(1000); console.timeEnd(); // default: 0.175048828125ms console.time(); fn(1000,1); console.timeEnd(); // default: 0.0498046875ms //从这我们看到优化后反而运行时间还会边长,这里我们可以理解到创建执行栈是要消耗时间的 console.time(); fun(10000); console.timeEnd(); // default: 1.386962890625ms console.time(); fn(10000); console.timeEnd(); // default: 0.467041015625ms // 从数量上看就可以看出内粗站溢出导致执行复杂度提高!
-
实现一个递乘函数fun(n),例如 n = 3 ; 1 x 2 x 3的结果
function fun(n){ if(n === 1){ return 1 } return n*fun(n-1); }
-
实现一个阶乘函数fun(x,n),得出x的n次方是的结果
function fun(x,n){ if(n===1){ return x } return x*fun(x,n-1); }
-
用递归实现一个汉诺塔,fun(n, a, b, c) ,
什么是汉诺塔 =》 汉诺塔又三根柱子 A ,B ,C A柱子上分别有n个从小到大的圆盘,然后每次只能取一个圆盘,怎么让C柱子跟A柱子一样从小到排列。 B为辅助柱
function fun(n,a,b,c){ if(n === 1){ console.log(a + '-->' + c) }else{ fun(n-1,a,c,b); console.log(a + '-->' + c); fun(n-1,b,a,c); } }
开发时碰见参数数据加密格式必须无限层排序,于是写了一个对象递归!
function sortObjKey(obj) {
let newObj = {};
Object.keys(obj).sort().forEach(item => {
if (typeof obj[item] === 'object') {
if (Array.isArray(obj[item])) {
obj[item].forEach(it => {
it = sortObjKey(it);
})
} else {
obj[item] = sortObjKey(obj[item]);
}
}
newObj[item] = obj[item];
})
return newObj
}
console.log(sortObjKey(obj),'???');