如何用R语言找出列表中3个数和为20的所有组合?
更简单的R解决方案:找出3个数字和为20的组合
嗨,我完全理解你想要从给定数字列表里筛选出所有3个数字之和为20的组合,而且觉得之前的递归代码不太好调整。其实在R里有个非常直观的工具——combn()函数,专门用来生成指定长度的元素组合,搭配简单的筛选逻辑就能轻松解决你的问题,不用折腾复杂的递归!
具体实现步骤
首先定义你的数字列表:
nums <- c(1, 3, 4, 5, 7, 9, 10, 12, 15)
接下来用combn()生成所有3个数字的组合,同时筛选出和为20的组合。这里有两种简洁的写法:
写法一:分步处理(逻辑更清晰)
# 生成所有3元素的组合矩阵,每一列对应一个组合 all_3combos <- combn(nums, 3) # 计算每个组合的和,筛选出和为20的列索引 target_cols <- which(colSums(all_3combos) == 20) # 提取符合条件的组合,转成易读的列表格式 valid_combos <- split(all_3combos[, target_cols], col(all_3combos[, target_cols])) # 输出结果 valid_combos
写法二:一行式(代码更简洁)
valid_combos <- Filter(Negate(is.null), combn(nums, 3, FUN = function(x) if(sum(x) == 20) x else NULL)) # 输出结果 valid_combos
最终结果
运行代码后,你会得到所有符合条件的组合:
$`1` [1] 1 4 15 $`2` [1] 1 7 12 $`3` [1] 1 9 10 $`4` [1] 3 5 12 $`5` [1] 3 7 10 $`6` [1] 4 7 9
为什么这个方法更友好?
combn()函数帮你自动处理了所有3元素组合的生成逻辑,不需要手动写递归的终止条件、剩余元素处理这些细节。你只需要专注于“筛选和为20的组合”这个核心需求,代码逻辑清晰易懂,后续如果要调整组合长度(比如找4个数字的组合),只需要修改combn()的第二个参数即可。
内容的提问来源于stack exchange,提问作者user3115933
相关产品推荐
相关产品推荐

