逆推法求解N级阶梯问题

所谓逆推,即:从已知问题的结果出发,用迭代表达式逐步推算出问题的开始的条件

问题

有一条总共N级的阶梯,一步可以跨一级,也可以跨两级,请问走完这N级阶梯总共要多少总走法?

分析

惯常思维,顺序迭代,第一步可以一级也可以两级,在两个分支中第二步可以一级也可以两级,第三步...
如此反复,我不相信你不凌乱

lin.jpg

但是如果以目标为导向往前推,走到第n级的时候,有可能是从n-1级过来的,也有可能是从n-2级过来的,那么问题可以分解为从f(n-1)和f(n-2),可以用公式表示之后,问题是不是清晰很多了

为什么会这样呢?设n=3,那么我们把所有的可能画成一棵树(数字表示阶梯的编号):

tree.png

顺推相当于你要从叶子节点去画一棵树,而逆推相当于从根节点去画一棵树,这还是n=3的情况,n=10的时候如果你不凌乱的话那可以去最强大脑了

要诀:

  1. 枚举的问题多半与树有关,多往这想想
  2. 顺推不行的时候,换一个方向,从目标往回推试试

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, []);
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容