所谓逆推,即:从已知问题的结果出发,用迭代表达式逐步推算出问题的开始的条件
问题
有一条总共N级的阶梯,一步可以跨一级,也可以跨两级,请问走完这N级阶梯总共要多少总走法?
分析
惯常思维,顺序迭代,第一步可以一级也可以两级,在两个分支中第二步可以一级也可以两级,第三步...
如此反复,我不相信你不凌乱
但是如果以目标为导向往前推,走到第n级的时候,有可能是从n-1级过来的,也有可能是从n-2级过来的,那么问题可以分解为从f(n-1)和f(n-2),可以用公式表示之后,问题是不是清晰很多了
为什么会这样呢?设n=3,那么我们把所有的可能画成一棵树(数字表示阶梯的编号):
顺推相当于你要从叶子节点去画一棵树,而逆推相当于从根节点去画一棵树,这还是n=3的情况,n=10的时候如果你不凌乱的话那可以去最强大脑了
要诀:
- 枚举的问题多半与树有关,多往这想想
- 顺推不行的时候,换一个方向,从目标往回推试试
js代码实现
function showSteps(n, array) {
array.unshift(n);
if(n > 2) {
//必须重新复制数组,否则各路径应用的相同的内存地址,相互污染
showSteps(n-1, array.slice());
showSteps(n-2, array.slice());
} else {
console.log('***************数字代表阶梯的编号*******************');
console.log(array);
}
}
showSteps(5, []);