题目描述
求1+2+3+...+n,要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句(A?B:C)。
当拿到这个题目的时候是没有任何思路的,感觉是很难的一个题目,但是在自己思考的时候发现,这其实是一个很简单的题目,发现题目给我的暗示就是你不能使用循环来实现这些东西,就自然而然的想到什么能够替代循环来实现,那就是递归了。
class Solution {
public:
int Sum_Solution(int n) {
if (n == 1)
return 1;
else
return n + Sum_Solution(n - 1);
}
};
这是我写完的程序,发现程序也并没有超过时间空间的限制,主要是....我使用了if条件语句还是通过了。
我在看大神们提交的代码的时候发现了一个很有趣的东西,那就是短路定理。短路一般我们都是在学习电路的时候所提到的,看到大家都在说这个之后我去百度了一下C语言的短路定理到底是个什么。看完之后才发现这个东西我们之前就接触过,但是并不知道还可以这样使用。
简单的来说就是利用我们之前所学过的&&运算和||运算,我们在学习这两个运算的时候有说过这两个运算有一个他们的特性,首先(表达式1)&&(表达式2)他的特点是有假则假,也就是说有一个是假的那整个式子就是假的了,所以如果我们的表达式1的式子是假的那程序就不会再去执行我们的表达式2因为无论2是真还是假整个式子都是假的。那(表达式1)||(表达式2)自然就是有一个真的那整个式子就是真的,所以如果表达式1是真的那也就不用再去看我们的表达式2.这就成就了我们的短路定理,也就是说如果表达式1运算完成之后式子的真假已经确定了,那程序就不会再去执行表达式2那么表达式2就是被短路了,这就是短路定理。
public class Solution {
public int Sum_Solution(int n) {
int sum = n;
boolean flag = (sum>0)&&((sum+=Sum_Solution(--n))>0);
return sum;
}
}
这个程序看起来也是运用了递归,但是我们知道递归是要有边界值的,也就是说我们的递归到底什么时候会结束,因为我们的栈桢是有限的所以不能一直递归下去,如果没有接触我们的短路定理的话,看起来这个递归是没有边界的,但是通过短路定理来分析,就能看出来,如果我们的sum<=0那后边的递归函数我们是不会去进行的,短路定理就直接代替了我们的if条件语句。
这道题目还有很多其他解法,不过其他方法我并不是很能理解。以后补充。