这种形式是一会儿循环的坏形式吗?

Is this bad form for a while loop?

提问人:user3542203 提问时间:10/31/2023 更新时间:10/31/2023 访问量:48

问:

我想做一个 while 循环来检查最接近的 2 的幂并返回 2 的幂。该函数适用于除目标为 1 的情况之外的所有值。有没有更好的方法可以在不使用 if 语句的情况下格式化它?

def power_of_two(target):
    """
    -------------------------------------------------------
    Determines the nearest power of 2 greater than or equal to
    a given target.
    Use: power = power_of_two(target)
    -------------------------------------------------------
    Parameters:
        target - value to find nearest power of 2 (int >= 0)
    Returns:
        power - first power of 2 >= target (int)
    -------------------------------------------------------
    """
    x = 0
    count = 0
    while target > x:
        count += 1
        x = 2**count
    if target == 1:
        count = 1
    else:
        count = 2**count
    return count

我尝试更改计数的值,但我想不出更好的方法

python-3.x while循环

评论

0赞 Andrej Kesely 10/31/2023
如果你想做它,你可以回来while2 ** (len(bin(number)) - 2)

答:

3赞 Nathaniel Ford 10/31/2023 #1

您不需要跟踪,因为您返回的是数字,而不是到达那里所需的指数:count

def power_of_two(target):
    x = 2
    while x < target:
        x = x * 2
    return x

while是循环的隐式绑定。在这里,您只需开始并不断将其乘以 2,直到您超过目标。您也可以从 开始,尽管描述那里的边界有点困难。它也不会告诉你你最终使用什么指数 - 但你无论如何都扔掉了这些信息。if21

评论

0赞 user3542203 10/31/2023
这似乎失败了
0赞 Nathaniel Ford 10/31/2023
@user3542203 不确定你是否完成了你的信息...?
0赞 Suramuthu R 10/31/2023 #2

如果你想要更小数字的结果,好吧,你可以用循环来做。如果目标数字由大约 15 位数字或其他数字组成,则循环执行需要多长时间?

为此,有一种更好的方法,不涉及循环。

def power_of_two(target):
    import math
    pwr = math.log(target)/math.log(2)
    pwr = math.floor(pwr)
    return 2**pwr

#case 1:
r = power_of_two(1500)
print(r)
#output: 1024

#case 2:
r = power_of_two(15564387909876345642500)
print(r)
#Output :9444732965739290427392

这背后的想法是:当我们想知道数字 A 给 B 带来什么幂时,找出的唯一方法是对两边都进行对数。例如,

'''
A**x = B

If we have to find out x, we take log on both sides:

log A**x = Log B
x* log A = log B (Since log A**x = x log A)
x = log B / log A 
'''

希望这会有所帮助