题目
求 1+2+...+n
,要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句(A?B:C)。
示例 1:
输入: n = 3
输出: 6
示例 2:
输入: n = 9
输出: 45
限制:
1 <= n <= 10000
解题思路
1)直接计算要使用运算符号,迭代要使用 while 或者 for 关键字,因此这两个都不能使用。
2)再说递归,不能使用 if 关键字来终止递归,所以要考虑其他办法终止递归,也就是逻辑运算符的短路性质。
常见的逻辑运算符有三种,即 “与 && ”,“或 || ”,“非 ! ”,而其有重要的短路效应:
if(A&&B) // 若 A 为 false ,则 B 的判断不会执行(即短路),直接判定 A&&B 为false;
if(A||B) // 若 A 为 true ,则 B 的判断不会执行(即短路),直接判定 A||B 为 true。
利用这一特性,我们可以将判断是否为递归的出口看作 A&&B 表达式中的 A 部分,递归的主体函数看作 B 部分。如果不是递归出口,则 A=true,并继续执行表达式 B 的部分,否则递归结束。
本题需要实现 “当 n=1 时终止递归” 的需求,可通过上述的短路效应来实现:
n>1 && sumNums(n - 1) // 当 n = 1 时 n > 1 不成立 ,此时“短路”,终止后续递归;否则执行后半部分。
复杂度分析:
时间复杂度:O(n)。递归函数递归 n 次,每次递归中计算时间复杂度为 O(1),因此总时间复杂度为 O(n)。
空间复杂度:O(n)。递归函数的空间复杂度取决于递归调用栈的深度,这里递归函数调用栈深度为 O(n),因此空间复杂度为 O(n)。
代码
class Solution {
public int sumNums(int n) {
boolean flag = n > 1 && (n += sumNums(n-1))>0;
return n;
}
}