浮点数子集和问题的r-递归函数



我为子集和问题制作了一个递归函数f(s,x),当从值集合x中提取元素时,它能够产生所有唯一的组合,这些组合的总和达到目标和的s。

例如,假设x <- c(2,4,8,10)s <- 10表示目标和,函数f低于

f <- function(s, x, xhead = head(x,1), r = c()) {
if (s == 0) {
return(list(r))
} else {
x <- sort(x,decreasing = T)
return(unlist(lapply(x[x<=min(xhead,s)], function(k) f(s-k, x[x<= s-k], min(k,head(x[x<=s-k],1)), c(r,k))),recursive = F)) 
}
}

我可以得到子集和的所有组合,即

> f(s,x)
[[1]]
[1] 10
[[2]]
[1] 8 2
[[3]]
[1] 4 4 2
[[4]]
[1] 4 2 2 2
[[5]]
[1] 2 2 2 2 2

上面的函数适用于xs的整数但是,当我将xs都按比例缩小10时,即xs的浮点数,则输出变成不需要的:

> f(s/10,x/10)
[[1]]
[1] 1

但是期望的输出应该像

> Map(function(v) v/10, f(s,x))
[[1]]
[1] 1
[[2]]
[1] 0.8 0.2
[[3]]
[1] 0.4 0.4 0.2
[[4]]
[1] 0.4 0.2 0.2 0.2
[[5]]
[1] 0.2 0.2 0.2 0.2 0.2

我怀疑我的函数f在处理浮点数时一定有一些问题,但经过几次尝试后都未能解决。有人能帮我解决这个问题而不对函数f进行大的更改吗?

感谢您提前提供的帮助!

您可以在减法中使用round并设置小数点

f <- function(s, x, xhead = head(x,1), r = c()) {
if (s == 0) {
return(list(r))
} else {
x <- sort(x,decreasing = T)
return(unlist(lapply(x[x<=min(xhead,s)], function(k) f(round(s-k, 4), x[x<= round(s-k, 4)], min(k,head(x[x<= round(s-k, 4)],1)), c(r,k))),recursive = F)) 
}
}
f(s/10,x/10)

返回所需输出:

[[1]]
[1] 1
[[2]]
[1] 0.8 0.2
[[3]]
[1] 0.4 0.4 0.2
[[4]]
[1] 0.4 0.2 0.2 0.2
[[5]]
[1] 0.2 0.2 0.2 0.2 0.2

最新更新