剑指 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(递归+短路运算)的主要内容,如果未能解决你的问题,请参考以下文章

剑指Offer - 面试题64:求1+2+...+n

剑指offer-面试题64-求1+2+...+n-发散思维

剑指 Offer 64. 求1+2+…+n

剑指offer求1+2+3+...+n

剑指Offer打卡64. 求1+2+…+n

剑指Offer打卡64. 求1+2+…+n