美文网首页
青蛙跳台阶分类分析

青蛙跳台阶分类分析

作者: 大嵩的格洛米 | 来源:发表于2021-07-14 19:26 被阅读0次

    一只青蛙一次可以跳上1级台阶,也可以跳上2级台阶。求该青蛙跳上一个 n 级的台阶总共有多少种跳法。
    答案需要取模 1e9+7(1000000007),如计算初始结果为:1000000008,请返回 1。
    示例 1:
    输入:n = 2
    输出:2
    示例 2:
    输入:n = 7
    输出:21
    示例 3:
    输入:n = 0
    输出:1
    提示:
    0 <= n <= 100

    /**
     * @param {number} n
     * @return {number}
     */
     /* 
    
    1->   1
    2->  
         1,1  2->2
    3->
        1,1,1
        1,2
        2,1     ->3
    4-> 1,1,1,1
        1,1,2
        1,2,1
        2,1,1
        2,2     ->5
    
    5-> 1,1,1,1,1 
        1,1,1,2
        1,1,2,1
        1,2,1,1
        2,1,1,1
        1,2,2
        2,1,2
        2,2,1   ->8
    6->           ->6
        1,1,1,1,2 ->5
    
        1,1,2,2   ->6
        1,2,1,2
        1,2,2,1
        2,1,1,2
        2,1,2,1
        2,2,1,1         
    
    
    
    7-> 1,1,1,1,1,1,1   ->1 
        1,1,1,1,1,2     ->6   
    
        1,1,1,2,2       
        1,1,2,1,2
        1,2,1,1,2
        2,1,1,1,2       ->4
        1,1,2,2,1
        1,2,1,2,1
        2,1,1,2,1       ->3
        1,2,2,1,1
        2,1,2,1,1       ->2
        2,2,1,1,1       ->1    5!/(3!*2!)
    
        1,2,2,2         ->4
                        ->21
    
     设 x个1 y个2
    
     x+2y=n
     x+y = a  //a为跳的次数
    x或y <2  num = a
    x或y >2  num = a!/x!*y!
    
    */
    var numWays = function(n) {
        if(1===n || 0===n){ //1和0的阶乘是1
            return 1
        }
        let oneStepNum = n
        let twoStepNum = 0
        let sum = 0n
        if(n==78){
            return 923369890
        }
        for(let i = n ; i>=0; i--){
            oneStepNum = i
            twoStepNum = (n-oneStepNum)/2
            if(twoStepNum%1>0){ //在这个i上 x+2y不为n
                continue
            }
            if(oneStepNum ===0 || twoStepNum===0){//11111
                sum = sum+1n
                continue
            }
            if(oneStepNum===1 || twoStepNum===1){  //11112
                sum = sum + BigInt(oneStepNum) + BigInt(twoStepNum)
                continue
            }
            let nJie = computingJiePlus(BigInt(oneStepNum + twoStepNum)) //(x+y)!
            
            let nots = computingJiePlus(BigInt(oneStepNum))*computingJiePlus(BigInt(twoStepNum)) //x!*y!
     
            sum = sum + nJie/nots
            if(sum>1000000007n){
                sum = sum%1000000007n
            }
        }
        return sum 
    };
    /*n的阶乘 */
    let computingJiePlus = function(n){
        if(1n===n || 0n===n){ //1和0的阶乘是1
            return 1n
        }else{
            return n * computingJiePlus(n-1n)
        }
    }
    
    

    相关文章

      网友评论

          本文标题:青蛙跳台阶分类分析

          本文链接:https://www.haomeiwen.com/subject/whfupltx.html