You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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:

  1. 初始状态:总和0,下一个数1
  2. 第1次迭代:总和0+1=1,下一个数2
  3. 第2次迭代:总和1+2=3,下一个数3
  4. 第3次迭代:总和3+3=6,下一个数4
  5. 第4次迭代:总和6+4=10,下一个数5
  6. 第5次迭代:总和10+5=15,下一个数6
    最终返回15,完全正确!

内容的提问来源于stack exchange,提问作者GregT

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 07:41:51