简单题我重拳出击(顺便讲讲递归的几种形式与总结)--丑数I(明天冲丑数II)

题目:

在这里插入图片描述

题目解读:

当 n>0 时,若 n 是丑数,则 n 可以写成 n = 2 a ∗ 3 b ∗ 5 c n = 2^a * 3^b*5^c n=2a3b5c特别的当a=b=c=0时,n=1。所以根据这个数学公式我们很快可以重拳出击了。只要能被这三个数字的其中一个整除,我们就一直除下去,若最后的结果为1,则就是丑数了!!

代码:

普通递推:

class Solution {
public:
    bool isUgly(int n) {
        if(n<=0)
            return false;
        int ugly[3] = {2,3,5};
        for(int i=0;i<3;i++){
            while(n%ugly[i]==0){
                n /= ugly[i];
            }
        }
        return n==1;
    }
};

递归法:
利用条件化的return 且每个return中只有一个递归,故每个结点只会产生一次递归。。
这种类型的递归一般用于bool类型的搜索判断。还有一种递归判断的结构就是将递归的结果放在if的判断条件上。
可总结出几条结论

  1. 在递归中return决定了每次递归所能执行的代码范围。而递归函数则是决定了暂时停止操作的点
  2. 比如一堆语句出现在一个递归函数的前面,则它就是在前往深层递归的途中被执行的代码。若出现在递归函数的后面则是返回途中执行的代码。即对应树的先中后序遍历位置
  3. 而return的位置也很巧妙,比如return中直接添加递归语句,则返回途中不会执行额外的代码,也就是俗称的压栈吧。
class Solution {
public:
    bool isUgly(int n) {
        if(n <= 0)
            return false;
        if(n == 1)
            return true;
//利用条件化的return 且每个return中只有一个递归,故每个结点只会产生一次递归。。这种类型的递归一般用于bool类型的搜索判断。还有一种递归判断的结构就是将递归的结果放在if的判断条件上。
        if(n % 2 == 0)return isUgly(n/2);
        if(n % 3 == 0)return isUgly(n/3);
        if(n % 5 == 0)return isUgly(n/5);
        
        return false;
    }
};

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值