递归:判断一个数是否是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

我们可以把这个循环做一个分解

  1. 如果n不能被2整除,说明n是一个奇数,一定不是2的幂次方
  2. 如果n能被2整除,那么n就除以2
  3. 循环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的幂的主要内容,如果未能解决你的问题,请参考以下文章

递归:判断一个数是否是2的幂

快速判断一个数是否是4的幂次方,若是,并判断出来是多少次方!

判断整数是不是是2的幂次方

二进制实战技巧

快速判断一个数是否是2的次方以及是几次方(二进制)

面试题判断一个数是否为2的N次方---终极接法来啦