我试图通过重复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已使用le
和ri
命令更改了所有三组abundants
,pop!
和shift!
。通过使用一个愚蠢的额外身份映射,我能够解决这个bug /问题:
le=map(x->x,abundants)
ri=map(x->x,abundants)
现在输出会改变到我最初的预期:
6964
false 6963 6964
我的问题是,如果这不是一个错误,为什么Julia首先在le
,ri
和abundants
集之间保持等价关系?此外,任何人都可以重现这种行为吗?我正在使用Julia"版本0.3.0-rc3 + 14(2014-08-13 16:01 UTC)"在Ubuntu 14.04上。
答案 0 :(得分:5)
le
和ri
都指向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
。