Java实现前N个正整数求和:禁用循环、递归与乘法
解决前N个正整数求和问题(不自定义循环/递归/乘法)
嘿,这个问题确实有点挑战性!不过你发现的Number类内置while循环方法,刚好是解开这个死结的钥匙。咱们一步步来理清楚怎么实现:
核心思路
前N个正整数的和本质是 1+2+3+...+N,我们没法自己写循环递归,也不能用乘法公式,那唯一的出路就是把迭代逻辑交给Number类已有的while循环方法来处理,我们只需要定义每次迭代要维护的状态(也就是你说的“自定义不可变类实例传递小计”),让内置循环帮我们推进累加过程。
首先先明确给定Number类的核心规则(根据你的描述):
- 有现成的静态实例
ZERO和ONE - 只能通过调用
add(Number other)生成新实例,不能自己创建 - 内部带有可用于迭代的while循环方法(不用我们自己写循环逻辑)
具体实现步骤
1. 定义不可变状态类
我们需要一个不可变类来保存每次迭代的两个关键值:当前的累加和、下一个要加的正整数。这个类只负责状态的传递和更新,完全符合不可变要求:
import f.Number; // 不可变状态类,用来传递累加过程中的小计和当前数 final class SumTrackingState { private final Number currentTotal; private final Number nextNumberToAdd; // 私有构造,保证不可变性 private SumTrackingState(Number currentTotal, Number nextNumberToAdd) { this.currentTotal = currentTotal; this.nextNumberToAdd = nextNumberToAdd; } // 初始状态:总和为0,第一个要加的数是1 public static SumTrackingState start() { return new SumTrackingState(Number.ZERO, Number.ONE); } // 生成下一个状态:总和加上当前数,下一个数加1 public SumTrackingState moveToNext() { return new SumTrackingState( currentTotal.add(nextNumberToAdd), nextNumberToAdd.add(Number.ONE) ); } // 获取最终的累加和 public Number getFinalSum() { return currentTotal; } }
2. 借助Number类的内置循环完成迭代
既然Number类里有现成的while循环方法,我们只需要调用它,告诉它迭代次数(就是输入的N)、初始状态,以及每次迭代如何更新状态。假设Number类提供了一个泛型迭代方法(如果没有泛型,思路类似,只是需要调整传递方式):
import f.Number; import java.util.function.UnaryOperator; public class FirstNSumCalculator { public static Number calculateSum(Number n) { // 调用Number类内置的迭代方法,传入迭代次数、初始状态、状态更新规则 // 这个方法内部用while循环执行n次状态更新,返回最终状态 SumTrackingState finalState = Number.iterate(n, SumTrackingState.start(), SumTrackingState::moveToNext); return finalState.getFinalSum(); } }
如果Number类的内置循环方法不是泛型的,比如只能处理Number类型的迭代,那我们可以换一种思路:用两个Number变量跟踪总和和当前数,借助Number类的循环方法来逐步更新它们(比如通过封装成数组或者其他不可变容器,但核心逻辑还是一样的)。
为什么这个方案符合要求?
- 没有自己写任何
for/while循环或递归,所有迭代逻辑都由Number类内置方法处理 - 没有使用乘法,完全依赖
add方法完成累加 - 没有创建自定义的
Number实例,所有Number实例要么是现成的ZERO/ONE,要么是通过add生成的 - 用不可变的
SumTrackingState传递小计,完全符合不可变要求
举个例子验证
比如输入N=5:
- 初始状态:总和0,下一个数1
- 第1次迭代:总和0+1=1,下一个数2
- 第2次迭代:总和1+2=3,下一个数3
- 第3次迭代:总和3+3=6,下一个数4
- 第4次迭代:总和6+4=10,下一个数5
- 第5次迭代:总和10+5=15,下一个数6
最终返回15,完全正确!
内容的提问来源于stack exchange,提问作者GregT
相关产品推荐
相关产品推荐

