求 1 + 2 + . . . + n 1+2+...+n 1+2+...+n ,要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句(A?B:C)。
如果不加限制地使用递归的方法来实现这道题可以用以下方法来解题:
class Solution {
public:
int sumNums(int n) {
return n == 0 ? 0 : n + sumNums(n - 1);
}
};
但由于题目限制,因此就需要用逻辑运算符的短路性质来解决该问题:
以逻辑运算符 && 为例,对于 A && B 这个表达式,如果 A A A 表达式返回 F a l s e False False ,那么 A && B 已经确定为 F a l s e False False ,此时不会去执行表达式 B B B。同理,对于逻辑运算符 ∣ ∣ || ∣∣, 对于 A ∣ ∣ B A || B A∣∣B 这个表达式,如果 A A A 表达式返回 T r u e True True ,那么 A ∣ ∣ B A || B A∣∣B 已经确定为 T r u e True True ,此时不会去执行表达式 B B B。
利用这一特性,可以将判断是否为递归的出口看作 A && B 表达式中的 A A A 部分,递归的主体函数看作 B B B 部分。如果不是递归出口,则返回 T r u e True True,并继续执行表达式 B B B 的部分,否则递归结束。当然也可以用逻辑运算符 ∣ ∣ || ∣∣ 给出类似的实现,这里只提供结合逻辑运算符 && 的递归实现。
class Solution {
public:
int sumNums(int n) {
n && (n += sumNums(n-1));
return n;
}
};