递归:判断一个数是否是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的幂,所以直接返回就可以了,不需要再去求子问题的解。

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值