一.题目描述spa
求1+2+3+...+n,要求不能使用乘除法、for、while、if、else、switch、case等关键字以及条件判断语句 (即三元运算符,A? B : C)blog
二.题解递归
虽然求和问题自己很容易,但加上这么多限制条件的话,整个问题彷佛就不那么简单了。《剑指offer》虽然给出了四种解决方法,但这四种方法都是基于C++的语言特性求解的,并非通用的解法。因此,本文旨在给出通用的解法。首先,根据以上的限制条件,能够考虑的角度只有两种(我的见解)一个是递归,另外一个是位运算。从位运算的角度来考虑的话,能够利用相似快速幂的思想,可是这个角度不容易想到,且实现比较麻烦(可参考牛客网讨论区 马克的答案)。另外一个角度就是递归,若是没有限制条件的话,使用递归的代码以下:it
int Sum_Solution(int n) { int sum = n; if(n == 0) return sum; return sum + Sum_Solution(n - 1); }
这段代码主要有两个关键点:递归的终止条件和如何进行下一步递归。回到原问题上,因为题目要求不能使用if来进行条件判断,因此咱们要经过其余操做来实现n == 0的判断,最容易想到的就是&&操做符,它一样地能进行条件判断,这主要得益于它的一个特性:即A&&B的话,只有条件A知足的话,才会对条件B进行判断;不然就不会对条件B进行判断。这个特性就是所谓的与操做符的短路特性。根据这个特性,很容易想到改进后的代码:io
int Sum_Solution(int n) { int sum = n; bool flag = (n > 0) && ((sum += Sum_Solution(n-1)) > 0);//第一个条件(n > 0)至关于终止条件 return sum;
}
这段代码时间复杂度为O(n)。主要经过&&操做符,实现了与上段代码一样的操做,它们的逻辑本质上是同样的。只有当n>0的时候,sum才会进行下一次递归,不然就不会递归。又因为&&操做的返回的结果是0或1,因此定义一个布尔型的变量最为合适。class