求:
求 1+2+...+n ,要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句(A?B:C)。
示例 1:
输入: n = 3
输出: 6
示例 2:
输入: n = 9
输出: 45
解:
首先想到等差数列求和公式,Sn=n*(n+1)/2,由于题目要求不能做乘除法,可以用>>1代替/2,那么用什么代替乘法?因为Sn=n*(n+1)/2,变形:Sn=(n*n+n)/2,所以可以使用pow(n,2)代替n*n得到结果(结果需要由double转int,涉及浮点运算,复杂化了问题)。
有其他更好的解法吗?
这里想到了循环和递归的等价实现,因为不能用循环,因此考虑递归求解。得到递归式:sumNums(n) = n + sumNum(n-1),这里需要给出递归停止的条件(递归基),很明显,当n为0时递归应该终止。
但是我们不能使用if进行判断怎么办?于是我们想到可以使用逻辑运算符中蕴含的短路运算逻辑,a&&b,如果a为true,计算b,否则不计算。(a||b类似,a为true,不计算b,否则计算)
&&的实现:
int
sumNums(
int
n){
int
sum =
0
;
n && (sum += n+sumNums(n-
1
));
return
sum;
}
||的实现
int
sumNums(
int
n){
int
sum =
0
;
n==
0
|| (sum += n+sumNums(n-
1
));
return
sum;
}
来源:oschina
链接:https://my.oschina.net/u/4469818/blog/4298558