Java递归方法调用:如何将折扣分摊至JavaBean列表直至折扣清零
Java递归实现折扣分摊至元素列表直至折扣清零
首先得说,你当前的代码问题出在循环里每次都用初始的discount值,没有把上一次处理后剩余的折扣传递给下一个元素,而且递归的逻辑完全没落地——你现在的myMethod根本没做递归调用,只是做了一次计算就返回了。
我来给你调整成符合需求的递归实现,核心思路是:逐个处理列表里的元素,每次用掉部分或全部折扣,把剩余折扣传递给下一个元素的递归调用,直到折扣清零或者所有元素处理完毕。
第一步:先明确CustomClass的结构(假设你是这样定义的)
public class CustomClass { private int amount; public CustomClass(int amount) { this.amount = amount; } public int getAmount() { return amount; } public void setAmount(int amount) { this.amount = amount; } }
第二步:实现递归方法
递归的关键是终止条件和状态传递:
- 终止条件:当剩余折扣
<=0,或者已经处理完所有元素时,停止递归 - 状态传递:每次处理完一个元素后,把剩余折扣传给下一个元素的递归调用
// 递归处理方法:传入元素列表、当前处理的索引、剩余折扣 private void applyDiscountRecursively(List<CustomClass> customList, int currentIndex, int remainingDiscount) { // 终止条件:折扣已经用完,或者没有更多元素可处理 if (remainingDiscount <= 0 || currentIndex >= customList.size()) { return; } CustomClass currentCustom = customList.get(currentIndex); // 计算本次能应用的折扣:最多把当前元素的金额减到0,避免出现负数 int discountToApply = Math.min(remainingDiscount, currentCustom.getAmount()); // 更新当前元素的金额 currentCustom.setAmount(currentCustom.getAmount() - discountToApply); // 计算剩余折扣 int newRemainingDiscount = remainingDiscount - discountToApply; // 递归处理下一个元素,传递更新后的剩余折扣 applyDiscountRecursively(customList, currentIndex + 1, newRemainingDiscount); }
第三步:调用递归方法
你只需要从第一个元素(索引0)开始,传入初始折扣值即可:
public static void main(String[] args) { List<CustomClass> customList = new ArrayList<>(); customList.add(new CustomClass(100)); customList.add(new CustomClass(80)); customList.add(new CustomClass(50)); int initialDiscount = 150; YourClassName instance = new YourClassName(); // 替换成你的类名 instance.applyDiscountRecursively(customList, 0, initialDiscount); // 打印结果验证 for (CustomClass custom : customList) { System.out.println("剩余金额:" + custom.getAmount()); } }
逻辑说明
拿上面的示例来说:
- 初始折扣150,第一个元素金额100:用掉100折扣,元素金额变0,剩余折扣50
- 第二个元素金额80:用掉50折扣,元素金额变30,剩余折扣0
- 触发终止条件,递归结束,第三个元素不会被处理
这样就完美实现了把折扣依次分摊到元素上,直到折扣清零的需求,而且是用递归的方式完成的。
内容的提问来源于stack exchange,提问作者Amit
相关产品推荐
相关产品推荐

