遞歸學(xué)習(xí)
-
實現(xiàn)一個輸入方法,fun(n) 打印n 直至到n = 0
function fun(n){ if(n===1){ return console.log(n) } console.log(n); fun(n-1); }
-
實現(xiàn)一個遞加函數(shù) fun(n),例如 n = 3 须肆; 1+2+3的結(jié)果
function fun(n){ if(n === 1){ return 1 } return n+fun(n-1); } //尾調(diào)優(yōu)化 尾調(diào)--> //當(dāng)函數(shù)執(zhí)行時創(chuàng)建執(zhí)行棧匿乃,上面的代碼如果執(zhí)行5計算的時候 //那么call task 就會在同一個執(zhí)行棧 分別調(diào)用5 生成 4 調(diào)用 4 生產(chǎn) 3 一直到調(diào)用到1 然后再返回執(zhí)行 //尾調(diào)優(yōu)化就是解決壓棧問題 - 讓他自身再一個內(nèi)執(zhí)行,返回一個函數(shù)豌汇,不是表達式 function fn(n,total){ if(n === 1){ return total }; return fun(n-1,n + total); } //我們可以做一個console.time() console.timeEnd() 來測試優(yōu)化 console.time(); fun(1000); console.timeEnd(); // default: 0.175048828125ms console.time(); fn(1000,1); console.timeEnd(); // default: 0.0498046875ms //從這我們看到優(yōu)化后反而運行時間還會邊長幢炸,這里我們可以理解到創(chuàng)建執(zhí)行棧是要消耗時間的 console.time(); fun(10000); console.timeEnd(); // default: 1.386962890625ms console.time(); fn(10000); console.timeEnd(); // default: 0.467041015625ms // 從數(shù)量上看就可以看出內(nèi)粗站溢出導(dǎo)致執(zhí)行復(fù)雜度提高!
-
實現(xiàn)一個遞乘函數(shù)fun(n)拒贱,例如 n = 3 宛徊; 1 x 2 x 3的結(jié)果
function fun(n){ if(n === 1){ return 1 } return n*fun(n-1); }
-
實現(xiàn)一個階乘函數(shù)fun(x,n),得出x的n次方是的結(jié)果
function fun(x,n){ if(n===1){ return x } return x*fun(x,n-1); }
-
用遞歸實現(xiàn)一個漢諾塔逻澳,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); } }
開發(fā)時碰見參數(shù)數(shù)據(jù)加密格式必須無限層排序苞氮,于是寫了一個對象遞歸!
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),'???');