我想要一个减半直到达到 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))
你的尝试是错误的,原因有三。
- 您正在从循环内返回。因此,它永远不会执行超过一次。
- 除非
0
n
,否则您的循环永远不会执行,因为range
需要第三个参数作为负数来"向后"递增。 - 循环分配的
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,就把它切成两半,并在我们执行的一半数上加一。