剑指 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;
	}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值