2的32次方减1用python,用递归求数是否为2的幂

既然我在这里已经有了一个公认的答案,我就用这个来解释一下你的方法为什么不好:

它在python中使用递归。python需要为每个调用打开一个堆栈帧,因此对于非常大的数字,这将是一种不好的解决方法。对于非常大的整数,它甚至会失败。

我甚至不认为像python这样的非纯函数语言中的递归是直观的。有很多简单的方法可以做到这一点;例如,while循环:n = int(n)

while n>1:

if n/2 != n/2.0: #compare integer division to float division

return False

n = n/2

return True

通过了解计算机上整数的存储结构是什么:它是二进制的,可以用巧妙的方法检查2的幂。所以您可以在int的二进制表示中计算二进制1:return bin(n).count('1') == 1

也会起作用的。当然,这意味着python会在内部将整数转换为字符串,这会浪费大量内存。所以你也可以power_of_2 = 1

while power_of_2 <= n:

if power_of_2 == n:

return True

power_of_2 *= 2

return False

只需将你的数字与二的所有较小或相等的幂进行比较。(当然,这可能需要更长的时间和更多的内存,因为您的python解释器将不得不解释python,而不只是将整数转换为C中的字符串,但这是关于算法原理的,对吧?)这样,您就不需要仅仅为了在二进制表示中计算1的出现次数而保留内存。

当然,有一个解决问题的方法,我从C++中的{a1}写:bool(n and not (n&(n-1)))

解释n and not (n&(n-1)):n是真的,如果n != 0,否则它将被错误地限定为2的幂。

对于not (n&(n-1)):n&(n-1)检查某个东西是否不是2的幂,所以我们必须将其反转。&是按位“and”运算符。为了理解n & (n-1),假设n是2的幂,比如8。所以n-1 == 7,因此8|0b1000

7|0b0111

--------

&|0b0000

如您所见,对于二的所有幂,n&(n-1)是0,其计算结果为False。对于2的所有非幂,在减去1时不会反转所有位,因此n&(n-1) != 0,其计算结果为True。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值