0x01.问题
求
1+2+...+n
,要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句(A?B:C)
C++函数形式为 int sumNums(int n)
0x02.问题分析
本来是一个很简单的问题,但是加上不准使用这些语句的限制,瞬间就变得有些艰难。
我们来思考,不能用循环,也不能用乘除,怎么完成累加得过程呢?这个很简单,一般都能想到,那就是使用递归,好像除了递归,也没有能进行累加得操作了。
有了递归的思路后,我们应该继续思考下一步,怎样返回?递归最重要的就是返回条件,而返回条件肯定需要判断,需要判断就需要用到if,else,switch等选择语句,现在不能使用这些语句,是不是这个题就无解了啊???
我们再来回想一下我们的思路,看看能不能从中找到一些可以突破的点,第一个,使用递归,毋庸置疑,不用递归咋整,再么既有其它的办法了,第二个,使用递归是不是得确定返回条件,确实是,不确定返回条件,递归就会无限的执行下去,最终会导致栈溢出,第三个,确定返回条件是不是需要能够选择的语句,返回条件在这里就是n大于0,肯定需要能够选择的语句才能控制递归返回,这个也是毋庸质疑的,第四个,能够选择的语句是不是就只有 if else switch case A?B:C呢?一般常用的就这些,但是我们不能确定就只有这些,我们可以从一些基本的语句去找,看能不能找到具有选择功能的语句。
0x03.短路原则
&&运算符具有如下的特性:对于A&&B
- 如果A为true,返回B的布尔值。
- 如果A为false,直接返回false,不去执行B。
我们称这一特性为 短路原则
0x04.利用短路原则解决问题
了解短路原则之后,我们就能从短路原则中找到选择的功能了,在哪里呢?我们注意到,当A为假时,就不会去执行B了,如果我们把返回条件的相反值作为A,递归语句作为B,是不是就可以控制递归何时返回了呢 ?对的,就是这样,问题完美解决。
int sumNums(int n) {
n&&(n+=sumNums(n-1));
return n;
}
ATFWUS --Writing By 2020--03--16