如何计算我们可以将一个数字减半直到它达到 1 的次数?



我想要一个减半直到达到 1 的数字,然后它应该返回减半的次数。 例:

减半(4) 阿拉伯数字

减半(11) 3

由于 4/2 = 2 和 2/2= 1,因此它在达到 1 之前减半了两次,这就是我希望它返回的,但我的代码不起作用,为什么?可以修改吗?

这是我的代码

def halve(n):
i = 0 
for i in range(n,1):
if float(i/2) >=1:
i+=1
return i

谢谢

在我看来,你可以使用一些数学来写:

import math
def halve(n):
return math.floor(math.log(n, 2))

你的尝试是错误的,原因有三。

  1. 您正在从循环内返回。因此,它永远不会执行超过一次。
  2. 除非0n,否则您的循环永远不会执行,因为range需要第三个参数作为负数来"向后"递增。
  3. 循环分配的i将隐藏之前分配的i。让我们只使用while循环。
def halve(n):
i = 0 
while n/2 >= 1:
i += 1
n /= 2
return i

既然你想知道你的代码出了什么问题: 首先,直接的问题是你在第一次循环迭代时返回。仅当数字小于 1 时才需要返回(因此不满足if条件):

else:
return i

现在,还有另一个问题 - 您正在迭代range(n,1)...真的没有意义。您需要少于n个格才能达到小于 1 的数字。改用 while 循环 - 这样您就可以根据需要循环。您也使用i作为迭代器,但似乎也在划分它以查看它是否不止一个 - 您不应该在那里使用n吗?你也没有减少n,所以你实际上永远不会达到n<1。 将所有这些代码都视为如下所示:

while True:
if float(n/2) >=1:
i+=1
n /= 2
else:
return i

我们可以进一步改进它 - 由于您希望在不满足条件时代码结束,我们可以简单地将其移动到while条件:

def halve(n):
i = 0 
while float(n/2) >=1:
i+=1
n /= 2
return i

正如 Norimaki @Sembei评论的那样,while循环更适合这个用例。

def halve(n):
halves = 0
while n > 1:
n /= 2
halves += 1
return halves

这个循环可以概括为"只要n大于1,就把它切成两半,并在我们执行的一半数上加一。

相关内容

最新更新