剑指 Offer 64. 求1+2+…+n(递归+短路运算)
Posted --believe
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了剑指 Offer 64. 求1+2+…+n(递归+短路运算)相关的知识,希望对你有一定的参考价值。
一、题目
剑指 Offer 64. 求1+2+…+n
题目描述
求 1+2+...+n
,要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句(A?B:C)。
示例1:
输入: n = 3
输出: 6
示例2:
输入: n = 9
输出: 45
二、分析
递归+短路运算
这道题本来很简单,但是限制很多,就变得困难。
这道题不能用乘除法,意味着$ 1+2+3+…n=(1+n)*n/2 $不能用到这道题中。
再考虑用递归的思想,我们很容易写出递归代码
int sumNums(int n)
if (n == 0) return n;
return n + sumNums(n - 1);
但是出现了if判断。题目要求不能出现if判断及:三元表达式。
有什么可以去掉if判断呢?我们想到用 && || 非运算中的短路现象来实现。
短路:a&&b中,a表达式为false,就不会去执行b 表达式。这叫做短路
同理: a||b中,a表达式为true,就不会去执行b表达式。
我们利用a&&b(a||b同理)来实现if。 将上面递归代码加入 与运算 (暂不去掉if)如下:
if (n && (n=n + sumNums(n - 1) )) //n=n + sumNums(n - 1)赋值为n,方便统一return n
return n;
然后去掉if
n&&(n=n + sumNums(n - 1);
return n;
三、代码
递归+短路运算
/*
* 题目:剑指 Offer 64. 求 1 + 2 + … + n
* 描述:求 1+2+...+n ,要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句(A?B:C)。
* 实现:利用&&的短路性质来去掉if
* 复杂度:时间O(N):递归要n次
* 空间 O(N):递归深度n,消耗线性辅助空间
*/
int sumNums(int n)
(n) && (n =n+sumNums(n - 1));//可以利用与运算短路性质来取代if
return n;
四、总结
这道题学会了短路运算可以消去if。
在递归函数中,添加短路运算的时候,要考虑让返回值返回一样的值,这样方便递归。
可以记一下递归+短路运算的模板
int sumNums(int n)
(n) && (n =n+sumNums(n - 1));//可以利用与运算短路性质来取代if
return n;
以上是关于剑指 Offer 64. 求1+2+…+n(递归+短路运算)的主要内容,如果未能解决你的问题,请参考以下文章