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



# 一只青蛙一次可以跳上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
"""

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值