【剑指Offer】47、求1+2+3+4+···+n

  题目描述:

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

  解题思路:

  本题本身没有太多的实际意义,但是可以对程序员的发散思维能力进行考察,进而可以反映出对编程相关技术理解的深度。

  对于本题,书中给出了利用构造函数、虚函数、函数指针、模板类型求解等思路,在这里,若使用java实现,有些方法却是不适用的,比如构造函数法,java构造对象数组并不会多次调用构造函数,其他方法略显复杂,这里我们给出另外一个思路:

  可以通过递归来实现加法,但是由于无法使用if语句,因此对于递归的结束条件无法进行判断,这里用一个比较巧妙的思路:与运算的短路特性,所谓短路,比如 A && B,当A条件不成立时,不论B是否成立,结果都是false,所以B不再进行计算,利用短路特性可以实现递归停止,进而求出和。

  编程实现(Java):

public int Sum_Solution(int n) {
        /*
        等差数列求和:S=n(n+1)/2  无法使用
        1.需利用逻辑与的短路特性实现递归终止。 
        2.当n==0时,(n>0)&&((sum+=Sum_Solution(n-1))>0)只执行前面的判断,为false,然后直接返回0;
	    3.当n>0时,执行sum+=Sum_Solution(n-1),实现递归计算Sum_Solution(n)。
        */
        int sum=n;
        boolean ans = (n>0) && ((sum+=Sum_Solution(n-1))>0);
        return sum;
    }
posted @ 2019-05-14 11:59  gzshan  阅读(1416)  评论(0编辑  收藏  举报