变态跳台阶

一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶总共有多少种跳法。

和上一个思路差不多,找规律

台阶数, 跳法

1  1

2  2

3  4

4  8

5  16

得出两个规律

规律一:f(n) = 2*f(n-1)

规律二:f(n) = 2^(n-1)

规律一用于递归写法,规律二用于循环写法

先说递归写法

//思路:找规律f(n) = 2*f(n-1)
class Solution {
public:
    // 递归写法,应该会超时 f(n) = 2*f(n-1)
    int jumpFloorII(int number) {
        if (number <= 0)
            return 0;
        else if(number == 1)
            return 1;
        else return 2*jumpFloorII(number-1);
    }

};

再说非递归

//思路:找规律f(n) = 2*f(n-1)
class Solution {
public:
    
// 非递归写法 f(n) = 2^(n-1)
    int jumpFloorII(int number) {
        if(number <= 0)
            return 0;
        int times = 1;  // pow(2,number-1);
        for(int i = 1; i < number; i++)
            times *= 2;
        
        return times;
    }
};

还可以换成调用函数的方法   在cmath 中有个函数pow(a, b)  就是a^b  a的b次方, 但是左移是最快的

class Solution {
public:
// 非递归写法 f(n) = 2^(n-1)
    int jumpFloorII(int number) {
        if(number <= 0)
            return 0;
        return 1<<(number-1); // pow(2, number-1)
    }
};

注意这里 a << b ==>a*2^b  就是a乘以2的b次方

    a>>b ==> a/2^b       a除以a的b次方

  

左移右移详解

原文地址:https://www.cnblogs.com/xiaokang01/p/12456769.html