我有一个由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