题目:
题目解读:
当 n>0 时,若 n 是丑数,则 n 可以写成 n = 2 a ∗ 3 b ∗ 5 c n = 2^a * 3^b*5^c n=2a∗3b∗5c特别的当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的判断条件上。
可总结出几条结论:
- 在递归中return决定了每次递归所能执行的代码范围。而递归函数则是决定了暂时停止操作的点。
- 比如一堆语句出现在一个递归函数的前面,则它就是在前往深层递归的途中被执行的代码。若出现在递归函数的后面则是返回途中执行的代码。即对应树的先中后序遍历位置。
- 而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;
}
};