R中递归sappy函数的Julia等价

R中递归sappy函数的Julia等价,r,recursion,julia,R,Recursion,Julia,我在R中有一个函数(onestep如下),它将向量v作为参数,并返回一个新向量v作为输入向量的函数的输出。然后,我将该函数迭代了几次,并将每次迭代的输出向量(长度不尽相同,有时也会以长度0结束)保存在另一个函数中,如下所示(最简单的示例): 我想知道一种简洁而惯用的方法是什么,来实现这样一个递归函数,它在Julia中返回所有中间结果?有什么想法吗?(如果这件事很琐碎,我深表歉意,但我对朱莉娅来说是个新手)在简洁和惯用的方面我不确定,但我会这样做的 onestep(v) = [v 2*v] fu

我在R中有一个函数(
onestep
如下),它将向量
v
作为参数,并返回一个新向量
v
作为输入向量的函数的输出。然后,我将该函数迭代了几次,并将每次迭代的输出向量(长度不尽相同,有时也会以长度0结束)保存在另一个函数中,如下所示(最简单的示例):


我想知道一种简洁而惯用的方法是什么,来实现这样一个递归函数,它在Julia中返回所有中间结果?有什么想法吗?(如果这件事很琐碎,我深表歉意,但我对朱莉娅来说是个新手)

在简洁和惯用的方面我不确定,但我会这样做的

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)

根据您最初的问题,这里有另一种更简洁、更真实的递归方法:

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)

非常感谢-这对我来说太完美了!sapply将v集作为全局变量有点狡猾:-)非常感谢您的帮助@汤姆·温塞利尔是肯定的。另外,一般来说,当你从R移动到Julia时,你会发现你做了很多基于各种循环的事情,这通常比矢量化更快。因此,在很多情况下,像
sapply
这样的东西不会出现在你的脑海中。另外,如果你想获得性能,并且有R的背景,我强烈建议你阅读Julia性能指南,特别是要注意函数中的类型转换(为了简单起见,我在这里没有这样做)。谢谢你,+1-虽然我认为我还是更喜欢你的其他解决方案的可读性。我的最后一个小Julia程序就在这里,如果你想对我的编码方式发表评论,或者你是否会看到任何明显的提高性能的方法…@TomWenseleers是的,我支持你的可读性和简单直观的代码,而不是每次都试图找到最惯用和简洁的方法。我用很多语言编写代码,因此通常更喜欢基于实现一些简单而通用的编码原则的解决方案。
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)
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)