递归:判断一个数是否是2的幂
Posted 我家大宝最可爱
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了递归:判断一个数是否是2的幂相关的知识,希望对你有一定的参考价值。
2的幂
给你一个整数 n,请你判断该整数是否是 2 的幂次方
这个题一看立马就想到了循环
class Solution:
def isPowerOfTwo(self, n: int) -> bool:
while True:
if n == 0:
return False
if n == 1:
return True
if n % 2 == 0:
n = n // 2
else:
return False
我们可以把这个循环做一个分解
- 如果n不能被2整除,说明n是一个奇数,一定不是2的幂次方
- 如果n能被2整除,那么n就除以2
- 循环1,2
n不断的缩小并且不断的重复操作,这不就是妥妥的递归吗。
但是分析到最后我发现自己并不会写这个递归函数,因为我不知道该如何通过子问题去解决原问题。
- 原问题是
res=isPowerOfTwo(n)
- 子问题是
sr=isPowerOfTwo(n//2)
如果sr返回的是true,那么res应该返回什么呢,举个例子分析,假如n=17,那么有sr=isPowerOfTwo(17//2)
,17//2=8
是2的幂次方,所以sr=True
,我们知道了子问题的解,该如何去求原问题的解呢?既然子问题是2的幂次方了,即t=n//2
是n的幂次方,如果n也是2的幂次方,那么有t*2=n
,否者不是2的幂次方。如果sr=False
,说明子问题都不是2的幂次方,那么原问题肯定不是2的幂次方了,直接返回False即可
class Solution:
def isPowerOfTwo(self, n: int) -> bool:
if n <= 0:
return False
if n == 1:
return True
sr = self.isPowerOfTwo(n//2)
if sr:
return n == ((n//2)*2)
return False
然后我就看了别人写的递归方法,更加的简单巧妙。首先判断n能否被2整除,如果能被2整除就继续判断n//2
能否被2整除,不断的递归下去。这种递归与我想的正好相反,我思考的是先假设子问题有解,然后根据子问题去求解原问题,也就是在归
的时候去求解。而这种递归是先判断,然后再去处理子问题,这是在递
的时候就去求解了原问题。
class Solution:
def isPowerOfTwo(self, n: int) -> bool:
if n <= 0:
return False
if n == 1:
return True
if n % 2 == 0:
return self.isPowerOfTwo(n//2)
return False
当然这道题还有位运算与打表法,更加的巧妙了。
这个问题的核心点是在说,如果递归到当前head节点可以判单原问题解的时候,就不需要再去求子问题了。如果当前数不能被2整除,说明这个数肯定不是2的幂,所以直接返回就可以了,不需要再去求子问题的解。
以上是关于递归:判断一个数是否是2的幂的主要内容,如果未能解决你的问题,请参考以下文章