题目
算法思路
题设要求不能使用乘除法,所以
(
1
+
n
)
×
n
/
2
(1+n)\times n /2
(1+n)×n/2平均计算方法不可以用;要求不能使用while、for、if 等关键字以及条件判断语句,所以迭代法也不可以用。
至于递归法,最容易想到的递归代码如下:
class Solution {
public int sumNums(int n) {
if(n == 1)return 1;
n += sumNums(n - 1);
return n;
}
}
显然不可以这么写,那么问题的关键就在于如何用其他方法终止递归,我们可以利用 逻辑运算符的短路效应 ,即 A && B
如果 A 为 false 的话 B 的判断就不会执行,直接判定A && B
为 false;A || B
如果 A 为 true 的话 B 的判断就不会执行,直接判定A || B
为 true。
具体代码
注意:为了构成语句,必须添加一个辅助布尔量 x ,同理,开启下一层递归需要改写成sumNums(n - 1) > 0
。
class Solution {
int res = 0;
public int sumNums(int n) {
boolean x = n > 1 && sumNums(n - 1) > 0;
res += n;
return res;
}
}
代码简化:
class Solution {
public int sumNums(int n) {
boolean x = n > 1 && (n += sumNums(n - 1)) > 0;
return n;
}
}
复杂度分析
- 时间复杂度: O ( n ) O(n) O(n),需要开启 n 个递归函数。
- 空间复杂度: O ( n ) O(n) O(n),递归深度为 O ( n ) O(n) O(n)