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

如何用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 06:57:55