朱莉娅 - 相当于R

时间:2016-07-15 22:36:53

标签: r recursion julia

我在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中返回所有中间结果的这种递归函数的紧凑和惯用方法是什么?有什么想法吗? (道歉,如果这是微不足道的,但我是朱莉娅的新手)

2 个答案:

答案 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)