朱莉娅做任务奇怪的事情

时间:2014-08-28 04:01:20

标签: debugging julia

我试图通过重复Julia中一些简单的ProjectEuler问题来学习Julia。到目前为止,一切都非常顺利,直到我遇到这个令人沮丧的问题。我花了一些时间调试我的代码,这是我发现的: (希望我不会错过这里真正愚蠢的东西)

function is_abundant(n::Int)                        #just a function
    return prod(map(x->int((x[1]^(x[2]+1)-1)/(x[1]-1)),factor(n))) > 2 * n
end

abundants=[12]     #there should be a better way to initialize an Array
for i=13:28120
    if is_abundant(i)
        push!(abundants,i)
    end
end

le=abundants;      #The following lines are the problems
ri=abundants;
d=length(abundants)
println(d)
pop!(le)
shift!(ri)
println(le==ri, " ", endof(ri), " ", endof(abundants))

我得到的输出是:

6964 true 6962 6962

这意味着Julia已使用leri命令更改了所有三组abundantspop!shift!。通过使用一个愚蠢的额外身份映射,我能够解决这个bug /问题:

le=map(x->x,abundants)
ri=map(x->x,abundants)

现在输出会改变到我最初的预期:

6964 false 6963 6964

我的问题是,如果这不是一个错误,为什么Julia首先在leriabundants集之间保持等价关系?此外,任何人都可以重现这种行为吗?我正在使用Julia"版本0.3.0-rc3 + 14(2014-08-13 16:01 UTC)"在Ubuntu 14.04上。

1 个答案:

答案 0 :(得分:5)

leri都指向abundants指向的相同列表,因此这是预期的行为 - 它们都在同一个内存上运行。 This part of the manual可能会帮助您理解。或者可能是MATLAB differences部分,因为它在MATLAB中是不同的(但大多数其他语言都像Julia)。

有关

abundants=[12] #there should be a better way to initialize an Array

怎么样

abundants = {}  # Vector of anything

abundants = Int[]  # Vector of ints

而不是map(x->x,...),您可以使用copy