【剑指offer】64. 求1+2+…+n

题目描述

在这里插入图片描述
在这里插入图片描述

// 64. 求1+2+…+n

// 力扣
// 求 1+2+...+n ,要求不能使用乘除法、for、while、if、else、switch
// 、case等关键字及条件判断语句(A?B:C)。

// 牛客
// 求1+2+3+...+n,要求不能使用乘除法、for、while、if、else、switch、c
// ase等关键字及条件判断语句(A?B:C)。

题解


// 力扣
// 【伪解法】
// 首先会想到递归方法,但是if语句不让用,咋办呢?
// 执行用时:0 ms, 在所有 Java 提交中击败了100.00%的用户
// 内存消耗:35.6 MB, 在所有 Java 提交中击败了71.67%的用户
class Solution {
    public int sumNums(int n) {
		if (n = 1)
			return 1;
		return sumNums(n - 1) + n;
    }
}


// 力扣
// 【正式方法】
// 这时候就需要换种方式终止递归条件。还记得&&运算具有短路功能,
// 如果&&之前的内容不成立,&&之后的内容将无法执行。
// 我们设置一个boolean值b,做(n > 0)和 A逻辑 的&&运算,
// 这个A包含sumNums递归调用的逻辑,A是什么不重要,重要的是它能够
// 递归起来,帮我们把运算算完。这里我们设置一个合理的A,
// A 为 (sum += sumNums(n - 1)) > 0。这样我们可以递归调用
// sumNums,并把返回值累加到sum中,sum将被初始化为主函数输入n。
//
// 递归到当n=1变为n=0时,b前面的(n > 0)不成立,&&运算截断,递归自动停止。
// 我们返回的sum就是我们要的1+2+..+n。
// 
// 注:A逻辑是什么不重要,重要的是它可以帮我们递归主函数
// 你甚至可以写成((sum += sumNums(n - 1)) < 0)。
class Solution {
    public int sumNums(int n) {
		int sum = n;
		boolean b = (n > 0) && ((sum += sumNums(n - 1)) < 0);
		return sum;
    }
}



// 牛客
// 运行时间:10ms超过86.46%用Java提交的代码
// 占用内存:9824KB超过1.60%用Java提交的代码
public class Solution {
    public int Sum_Solution(int n) {
        int sum = n;
        boolean b = (n > 0) && ((sum += Sum_Solution(n - 1)) > 0);
        return sum;
    }
}

猜你喜欢

转载自blog.csdn.net/fisherish/article/details/115010098