青蛙跳台阶和验证幂数的方法



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

# 当跳1级台阶时,f(1) = 1;

# 当跳2级台阶时,f(2) = f(1) + 1 = 2;

# 当跳3级台阶时,f(3) = f(2) + f(1) + 1 = 4;

# 当跳4级台阶时,f(4) = f(3) + f(2) + f(1) + 1 = 8;

# f(n-1) = f(n-2) +...+ f(2) + f(1) + 1

# f(n) = f(n-1) + f(n-2) +...+ f(2) + f(1) + 1
#     =  f(0) + f(1) + f(2) + f(3) + ... + f(n-2)      +    f(n-1)
#     =               f(n-1)                           +    f(n-1)  = 2*f(n-1)
# 所以 f(n) = 2*f(n-1), n >=2   n=0和1时, f(n)=1


# 方法1(递归):
def num1(n):
    while n <= 2:
        return n

    return num1(n - 1) * 2


print(num1(15))     # 16384


# 方法2: 找规律
def num2(n):
    while n <= 2:
        return n
    return 2 ** (n - 1)     # 2, 4, 8, 16, 32


print(num2(15))     # 16384 == 2的14次幂


# 突发奇想: 如何验证16384是2的14次幂

# 方法1:通用方法
import math
def cloth_cover(num, backgroud):
    lognum = math.log(num, backgroud)       # 求以 backgroud 的多少次幂 等于num  返回值带小数点
    int_part = math.floor(lognum)           # math.floor 向下取整 math.ceil 向上取整
    if lognum - int_part == 0:
        print("%d是%d的%d次幂" % (num, backgroud, int_part))
    else:
        print('%d不是%d整数次幂' % (num, backgroud))


cloth_cover(16384, 2)


# 方法2:特殊方法
def judge(num):
    num = int(num)
    return True if num == 0 or num & (num - 1) == 0 else False


ret = judge(16384)
print(ret)
"""
    方法2原理:
        十进制           二进制
        0                 0
        2                 10
        4                 100
        8                 1000
        16                10000
        
        
        十进制            二进制
        1                 01
        3                 011
        7                 0111
        15                01111
        
        
       例如:16-15 == > 10000 & 01111 = > 0     
      # & : 如果相同位置,数字不同,则该位置结果为0, 相同则为1  
      # 具体: https://blog.csdn.net/qq_42327755/article/details/103560957
"""
发布了73 篇原创文章 · 获赞 14 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/qq_42327755/article/details/103703995