# 一只青蛙一次可以跳上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
"""
青蛙跳台阶和验证幂数的方法
猜你喜欢
转载自blog.csdn.net/qq_42327755/article/details/103703995
今日推荐
周排行