【递归】 LeetCode #面试题64 求1+2+...+n (巧用逻辑运算符“&&”、“||”设置递归的出口)

题目链接:

LeetCode #面试题64 求1+2+…+n

题目描述:

#面试题64. 求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

通过次数44,332 | 提交次数51,623

分析:

这个题是把简单题加了诸多限制,变成了一道中等难度的题目。

因为不能用循环,动态规划的法子就不能用了;

不能使用乘除法,所以也不能用等差数列公式;

剩下的能用的只有加减法、位运算、逻辑运算符、赋值

先来考虑能用 if 的话,递归要怎么写:

class Solution {
    public int sumNums(int n) {
        if(n == 0)  return 0;
        return n + sumNums(n- 1);
    }
}

本题的难点在于,不能用 if 的情况下,如何设置递归的出口?

这种题目实在没遇到过,想了很久没有好的思路,看了官方题解。

“答案就是逻辑运算符的短路性质。”

对于 A && B,如果 A 为 false,则表达式为 false,不会再执行 B 语句。我们所要利用的正是这个短路性质,当 n = 0 时,应该是递归的出口,不执行n += sumNums(n- 1)语句,其他非出口均执行。

需要注意的是,在 C++ 里可以这样写:n && (n += sumNums(n-1));

但是在 Java 中不可,Java 不认为这是一个语句,正确写法如下:boolean bl = n > 0 && (n += sumNums(n-1)) > 0;

代码:

/*
*不能用 if 的情况下,如何设置递归的出口
*看官方题解,善用逻辑运算符
*/
class Solution {
    public int sumNums(int n) {
        boolean bl = n > 0 && (n += sumNums(n-1)) > 0;
        return n;
       
    }
}

可以看看是如何利用逻辑运算符的短路性质:
【递归】 LeetCode #面试题64 求1+2+...+n (巧用逻辑运算符“&&”、“||”设置递归的出口)_第1张图片
用逻辑运算符的短路性质来巧妙地设置递归的出口是第一次遇到,是个很有创新的思路,需要理解记住,为以后做题提供一个思路。完全没接触过这个方法,想全凭自己想出来还是有点儿困难的。

5月26号开始断更了10天,忙着做核酸检测收拾行李返校了,接下来的6月会迎来一大批期末考试,疫情回来直接地狱模式…最晚到考试结束会恢复正常更新,到时候论文、算法、计算机基础三管齐下。

你可能感兴趣的:(LeetCode,剑指Offer)