如果我有一个像 union 这样的函数,它取两个集合的联合,那么有一个简洁的方法来编写一个函数,它接受任意数量的集合,即 union_n(x, y, z, w) = union(x, union(y, union(z, w))) ?
union
union_n(x, y, z, w) = union(x, union(y, union(z, w)))
没有递归的替代方案可能是这样的:
U2 = function(...) { unique(c(...)) } x = 1:3 y = 3:5 z = seq(2,8,2) U2(x,y,z) [1] 1 2 3 4 5 6 8
我最终用递归解决了这个问题:
union_n <- function(x) if (length(x) == 1) x[[1]] else union(x[[1]], union_n(x[-1]))
但是,我对更优雅或计算效率更高的解决方案持开放态度 .
试试 Reduce :
Reduce
x <- 1:3 y <- 2:4 z <- 3:5 w <- 4:9 Reduce(union, list(x, y, z, w)) ## [1] 1 2 3 4 5 6 7 8 9
或作为一种功能:
union_n <- function(...) Reduce(union, list(...)) union_n(x, y, z, w) ## [1] 1 2 3 4 5 6 7 8 9
3 回答
没有递归的替代方案可能是这样的:
我最终用递归解决了这个问题:
但是,我对更优雅或计算效率更高的解决方案持开放态度 .
试试
Reduce
:或作为一种功能: