短路效应递归求 1 + 2 + … + n

这篇博客介绍了如何利用短路效应来解决在限制使用特定关键字和条件判断的情况下,求1到n的和。通过分析递归、迭代等方法的局限性,最终提出利用逻辑运算符的短路效应来实现递归求和,同时提供了时间复杂度和空间复杂度的分析。
摘要由CSDN通过智能技术生成

求 1 + 2 + … + n

题目描述:

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

示例 1:

输入: n = 3
输出: 6

示例 2:

输入: n = 9
输出: 45

限制:

1 <= n <= 10000


解题思路:

看到这个题目,我们很多人理所当然的就会想到利用(1+n)*n/2求平均值,或者利用递归或者迭代,但事实是这三种方法能满足条件

不使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句(A?B:C)吗?我们不妨试试!

方法一(求平均值):
public int sumNums(int n) {
    return (1 + n) * n / 2;
}

很明显,这个方法用到了乘除法,肯定不行!

方法二(递归):
public int sumNums(int n) {
    if(n == 0) return 0;
    n += sumNums(n - 1);
    return n;
}
class Solution {
public:
    int sumNums(int n) {
        return n == 0 ? 0 : n + sumNums(n - 1);
    }
};

从上面的两段代码可知,递归用到了if、条件判断语句(A?B:C),也不行啊!

方法三(迭代):
public int sumNums(int n) {
    int res = 0;
    for(int i = 1; i <= n; i++)
        res += i;
    return res;
}

看到这,上面的代码出现了for循环,同样不行啊,真是令人头痛啊!

短路效应:

那到底有什么方法可以不用到乘除法、for、while、if、else、switch、case等关键字及条件判断语句(A?B:C)呢?

我们接着往下看,相信大家都学过离散数学吧,没学过或多或少也听过吧哈哈哈!

在离散数学里面,有三种逻辑运算符,分别是 “与 && ”,“或 || ”,“非 ! ” ,这三种逻辑运算符跟我们平时写的 “与 && ”,“或 || ”,“非 ! ”有点区别的就是它们有重要的短路效应

短路效应规则
if(A && B) // 若 A 为 false ,则 B 的判断不会执行(即短路),直接判定 A && B 为 false
if(A || B) // 若 A 为 true ,则 B 的判断不会执行(即短路),直接判定 A || B 为 true

在方法二(递归)中,要实现 “当 n = 0 时终止递归” 的需求,可通过短路效应实现。

x = n > 0 && (n += sumNums(n - 1)) > 0 // 当 n = 0 时 n > 0 不成立 ,此时 “短路” ,终止后续递归

复杂度分析:

时间复杂度 O(n) : 计算 n + (n-1) + … + 2 + 1 需要开启 n 个递归函数。
空间复杂度 O(n): 递归深度达到 n ,系统使用 O(n) 大小的额外空间。

代码:

class Solution {
    public int sumNums(int n) {
        boolean x = n > 0 && (n += sumNums(n - 1)) > 0;
        return n;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值