2014-08-28 1 views
1

Я пытаюсь узнать Джулию, повторив некоторые из простых проблем ProjectEuler в Джулии. До сих пор все было очень гладко, пока я не столкнулся с этой расстраивающей проблемой. Я провел некоторое время отладки мой код, и вот что я нашел: (Надеюсь, я не хватает чего-то действительно глупое здесь)Джулия делает что-то странное с заданиями

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

который означает, что Джулия изменила все три комплекта le, ri и abundants с каждой из pop! и shift! команд. Я был в состоянии работать вокруг этой ошибке/проблеме, используя тупую дополнительное тождественное отображение:

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

Теперь выход изменится на то, что я первоначально ожидалось:

6964 false 6963 6964

Мой вопрос, если это не ошибка, почему Джулия поддерживает отношение эквивалентности между le, ri и abundants устанавливает в первую очередь? Также может ли кто-нибудь воспроизвести это поведение? Я использую Julia «Версия 0.3.0-rc3 + 14 (2014-08-13 16:01 UTC)» на Ubuntu 14.04.

+0

Существует только один массив, вы просто делаете много ссылок на него. Связано: http://julia.readthedocs.org/en/latest/manual/faq/#i-passed-an-argument-x-to-a-function-modified-it-inside-that-function-but-on -The-вне-переменной-х-это-еще-неизменной почему. – StefanKarpinski

ответ

5

le и ri оба указывают на тот же список, что и abundants, так что это ожидаемое поведение - все они работают в одной и той же памяти. This part of the manual может помочь вам разобраться. Или, возможно, раздел MATLAB differences, так как он отличается от MATLAB (но большинство других языков похоже на Юлию).

Для

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.