我在R中有一个函数(下面是onestep
),它以向量v
为参数,并返回一个新的向量v
作为输出,它是输入向量的函数。然后我迭代了这个函数niter
次,并在另一个函数iterate
中保留每次迭代的输出向量(它们的长度不同,有时也可能最终长度为0),如下所示(最小的例子) ):
onestep = function (v) c(v,2*v)
iterate = function (v, niter) sapply(1:niter, function (iter) {v <<- onestep(v)
return(v) } )
示例:
v=c(1,2,3)
iterate(v,3)
[[1]]
[1] 1 2 3 2 4 6
[[2]]
[1] 1 2 3 2 4 6 2 4 6 4 8 12
[[3]]
[1] 1 2 3 2 4 6 2 4 6 4 8 12 2 4 6 4 8 12 4 8 12 8 16 24
我想知道在Julia中返回所有中间结果的这种递归函数的紧凑和惯用方法是什么?有什么想法吗? (道歉,如果这是微不足道的,但我是朱莉娅的新手)
答案 0 :(得分:3)
在紧凑和惯用的方面不确定,但这就是我做的事情
onestep(v) = [v 2*v]
function iterate(v, niter)
Results = Array(Array, niter)
Results[1] = onestep(v)
for idx = 2:niter
Results[idx] = onestep(Results[idx - 1])
end
Results
end
v = [1 2 3]
iterate(v, 3)
答案 1 :(得分:2)
根据您原来的问题,这是另一种更简洁,更真实的递归方式:
v = Array[[1, 2, 3]] ## create v as an array of one dimensional arrays
function iterate(v::Array{Array, 1}, niter::Int)
niter == 0 && return v[2:end]
push!(v, [v[end] ; 2v[end]])
niter -= 1
iterate(v, niter)
end
iterate(v, 3)