如何用purrr递归应用带可变参数的函数实现迭代组合计算?
用purrr实现嵌套组合的迭代计算
要实现从初始x=N、m=N开始,每次以上一步结果作为新的x,m递减1直到m=2的嵌套组合计算,我们可以用purrr::accumulate配合utils::combn完成,无需手动逐层编写map调用。
核心实现代码
library(purrr) # 设置基础参数 x <- 4 start_m <- 4 end_m <- 2 # 生成迭代所需的m值序列(从start_m-1递减到end_m) m_steps <- seq(start_m - 1, end_m, by = -1) # 迭代生成嵌套组合列表 result_list <- accumulate( .x = m_steps, .f = function(current_list, m) { map(current_list, ~ combn(.x, m, simplify = FALSE)) }, .init = combn(x, start_m, simplify = FALSE) )
代码说明
.init参数指定初始计算结果:即combn(x, start_m, simplify = FALSE),对应手动实现的n1;m_steps定义后续迭代的m值(示例中为3,2);accumulate会自动将上一轮的计算结果和当前m值传入处理函数,通过map对列表中每个元素调用combn生成下一层级的组合;- 最终
result_list包含所有层级的结果:result_list[[1]]对应n1,result_list[[2]]对应n2,result_list[[3]]对应手动实现的n3。
封装复用函数
如果需要多次调用,可以封装成函数:
generate_nested_combs <- function(x, start_m, end_m = 2) { # 参数合法性检查 stopifnot(start_m >= end_m, end_m >= 2) m_steps <- seq(start_m - 1, end_m, by = -1) accumulate( m_steps, ~ map(.x, combn, m = .y, simplify = FALSE), .init = combn(x, start_m, simplify = FALSE) ) } # 调用示例:获取x=4、从m=4到m=2的所有层级结果 all_levels <- generate_nested_combs(4, 4) # 提取最深层级的组合结果 deepest_level <- all_levels[[length(all_levels)]]
内容的提问来源于stack exchange,提问作者filemonPi
相关产品推荐
相关产品推荐

