求1+2+3+...+n

求1+2+3+...+n

求1+2+3+...+n,要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句(A?B:C)。


本题限制颇多,仔细想想,最合适的算法应该就是递归了

Sum_Solution(n)=n+Sum_Solution(n-1)

public class Solution {
    public int Sum_Solution(int n) {
        if(n==0){
            return 0;
        }
        int ans=n;
        ans+=Sum_Solution(n-1);
        return ans;
    }
}

记住递归能解决这类问题

但是!注意题目是不让用if的,怎么解决?

class Solution {
public:
    int Sum_Solution(int n) {
        int sum=n;
        sum && (sum+=Sum_Solution(n-1));
        return sum;
    }
};

&&是短路运算的,如果判断sum==0,那么sum+=Sum_Solution(n-1)就不会算,就直接返回0了。很巧妙,借助布尔运算和它的短路特性,将if要执行的句子和判断条件一起进行布尔运算,达到了判断的作用。要学会这种方法,它是和if判断等价的(当然,要执行的句子如果多于一句就比较麻烦了)

又但是!上面的代码是C++的,java中int不能直接转为boolean用,所以需要多写点,没有那么简洁了:

public class Solution {
    public int Sum_Solution(int n) {
        int ans = n;
        /*
        必须创建一个boolean变量
        第一个ans!=0好理解,第二个((ans += Sum_Solution(n - 1))!=0)),里面的ans += Sum_Solution(n - 1),其实最后得到的就是ans,这个打印出来就明白了。所以相当于先进行ans+=运算,再判断ans!=0.当然这个判断是没用的,因为它一定大于0,只是为了在布尔表达式中执行这么一个+=操作必须要有一个表达式存在
        */
        boolean t=((ans!=0) && ((ans += Sum_Solution(n - 1))!=0));
        return ans;
    }
}
posted @ 2020-03-07 10:47  别再闹了  阅读(58)  评论(0)    收藏  举报