If you are after just one sample instance, you can try
f <- function(i, n) {
if (n == 1) {
return(i)
}
p <- sample(0:i, 1)
c(p, Recall(i - p, n - 1))
}
and you can try, for example
> replicate(10, f(5, 3))
[,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
[1,] 4 0 2 4 0 4 1 0 5 2
[2,] 0 5 1 1 5 0 1 1 0 1
[3,] 1 0 2 0 0 1 3 4 0 2
If you want all permuations, you can simply define a recursion function f1
or f2
like below
f1 <- function(i, n) {
if (n == 1) {
return(i)
}
r <- lapply(0:i, \(k) {
Map(c, k, f1(i - k, n - 1))
})
unlist(r, recursive = FALSE)
}
or
f2 <- function(i, n) {
if (n == 1) {
return(i)
}
r <- lapply(0:i, \(k) {
cbind(k, f2(i - k, n - 1))
})
unname(do.call(rbind, r))
}
and you will see
> f1(5, 3)
[[1]]
[1] 0 0 5
[[2]]
[1] 0 1 4
[[3]]
[1] 0 2 3
[[4]]
[1] 0 3 2
[[5]]
[1] 0 4 1
[[6]]
[1] 0 5 0
[[7]]
[1] 1 0 4
[[8]]
[1] 1 1 3
[[9]]
[1] 1 2 2
[[10]]
[1] 1 3 1
[[11]]
[1] 1 4 0
[[12]]
[1] 2 0 3
[[13]]
[1] 2 1 2
[[14]]
[1] 2 2 1
[[15]]
[1] 2 3 0
[[16]]
[1] 3 0 2
[[17]]
[1] 3 1 1
[[18]]
[1] 3 2 0
[[19]]
[1] 4 0 1
[[20]]
[1] 4 1 0
[[21]]
[1] 5 0 0
> f2(5, 3)
[,1] [,2] [,3]
[1,] 0 0 5
[2,] 0 1 4
[3,] 0 2 3
[4,] 0 3 2
[5,] 0 4 1
[6,] 0 5 0
[7,] 1 0 4
[8,] 1 1 3
[9,] 1 2 2
[10,] 1 3 1
[11,] 1 4 0
[12,] 2 0 3
[13,] 2 1 2
[14,] 2 2 1
[15,] 2 3 0
[16,] 3 0 2
[17,] 3 1 1
[18,] 3 2 0
[19,] 4 0 1
[20,] 4 1 0
[21,] 5 0 0