把一个数字分成不相等的部分,以便平衡r中的矢量

  • 本文关键字:平衡 不相等 一个 数字 r
  • 更新时间 :
  • 英文 :


我有一个由10个随机整数组成的向量,如下所示:

a <- c(400,1,1,1,1,1,1,1,1,13)

我有一个随机整数:

n <- 100

我的目标是划分n,使a的组件之间的差异最小。在这种情况下,期望的输出是c(400,14,14,14,14,13,13,13,13,13)(13+13+13+12+12+12+12=100(

我的方法是使用递归函数:

dis <- function(n,a){
a[which.min(a)] <- a[which.min(a)] + 1 
n <- n -1
if(!n){
return(a)
}
dis(n,a)
}
dis(100, c(400,1,1,1,1,1,1,1,1,13))

但当n更大时,我发现了问题,例如当n为1000时,我得到了这个消息

错误:C堆栈使用7969684太接近m

我不确定是否有什么可以避免递归,也许是算术解决方案,或者其他方法。

为什么不将其作为while循环,而不是使用深度嵌套递归?

dis <- function(n,a) {
while(n > 0)
{
a[which.min(a)] <- a[which.min(a)] + 1 
n <- n - 1
}
a
}
dis(100, c(400,1,1,1,1,1,1,1,1,13))
#> [1] 400  14  14  14  14  13  13  13  13  13
dis(10000, c(400,1,1,1,1,1,1,1,1,13))
#> [1] 1043 1042 1042 1042 1042 1042 1042 1042 1042 1042

您需要对递归函数进行一些小的修改,例如

dis <- function(n, a) {
if (!n) {
return(a)
} else {
a[which.min(a)] <- a[which.min(a)] + 1
dis(n-1, a)
}
}

示例

> dis(100,a)
[1] 400  14  14  14  14  13  13  13  13  13
> dis(1000,a)
[1] 400 114 114 114 114 113 113 113 113 113

最新更新