剑指offer之1+2+3...+n 短路定理

题目描述

求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条件语句。

  这道题目还有很多其他解法,不过其他方法我并不是很能理解。以后补充。

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值