所謂逆推,即:從已知問題的結(jié)果出發(fā),用迭代表達式逐步推算出問題的開始的條件
問題
有一條總共N級的階梯,一步可以跨一級,也可以跨兩級,請問走完這N級階梯總共要多少總走法?
分析
慣常思維,順序迭代,第一步可以一級也可以兩級,在兩個分支中第二步可以一級也可以兩級,第三步...
如此反復,我不相信你不凌亂
lin.jpg
但是如果以目標為導向往前推,走到第n級的時候,有可能是從n-1級過來的,也有可能是從n-2級過來的,那么問題可以分解為從f(n-1)和f(n-2),可以用公式表示之后,問題是不是清晰很多了
為什么會這樣呢?設n=3,那么我們把所有的可能畫成一棵樹(數(shù)字表示階梯的編號):
tree.png
順推相當于你要從葉子節(jié)點去畫一棵樹,而逆推相當于從根節(jié)點去畫一棵樹,這還是n=3的情況,n=10的時候如果你不凌亂的話那可以去最強大腦了
要訣:
- 枚舉的問題多半與樹有關(guān),多往這想想
- 順推不行的時候,換一個方向,從目標往回推試試
js代碼實現(xiàn)
function showSteps(n, array) {
array.unshift(n);
if(n > 2) {
//必須重新復制數(shù)組,否則各路徑應用的相同的內(nèi)存地址,相互污染
showSteps(n-1, array.slice());
showSteps(n-2, array.slice());
} else {
console.log('***************數(shù)字代表階梯的編號*******************');
console.log(array);
}
}
showSteps(5, []);