统计1、2、3、4凑和为10的Java递归代码为何仅返回1而非总方案数?
问题原因及修复方案
错误根源
你的代码核心问题是使用了Java的短路或运算符||:只要||左侧的表达式返回true,右侧的所有表达式都会直接跳过执行。你把四条递归调用用||串联后,只要任意一条路径凑出和为10,后续所有其他可选路径的递归都会被中断,自然只能统计到1种方案。
修复方法
方案1:统计有序方案(顺序不同算不同方案)
直接去掉布尔返回值和短路逻辑,让四条递归路径全部独立执行即可,修改后代码如下:
public class Main { static int count = 0; public static void work(int i){ if (i == 10) { count++; return; } if (i > 10) { return; } work(i + 4); work(i + 3); work(i + 2); work(i + 1); } public static void main(String[] args) { work(0); System.out.println(count); } }
运行后输出结果为401,对应所有有序排列的方案总数,比如1+2和2+1会被算作两种不同的方案。
方案2:统计无序方案(顺序不同算同一种方案)
如果只需要统计不考虑排列顺序的组合数,可以增加参数限制每次选取的数字不小于上一次的,避免重复统计相同组合的不同排列,修改后代码如下:
public class Main { static int count = 0; // min参数限制本次选取的数字最小值,保证组合升序不重复 public static void work(int i, int min){ if (i == 10) { count++; return; } if (i > 10) { return; } for (int num = min; num <= 4; num++) { work(i + num, num); } } public static void main(String[] args) { work(0, 1); System.out.println(count); } }
运行后输出结果为23,对应所有无序组合的方案总数。
内容的提问来源于stack exchange,提问作者coolness
相关产品推荐
相关产品推荐

