2014-08-28 1 views
1

저는 Julia에서 ProjectEuler의 쉬운 문제 중 일부를 반복하여 Julia를 배우려고합니다. 지금까지이 모든 실망스러운 문제에 봉착 할 때까지 모든 것이 정말 부드럽습니다. 난 내 코드를 디버깅 시간을 소비하고, 여기에 내가 무엇을 발견 :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

을하는 줄리아가 le,및 abundants의 세 세트를 모두 pop!shift! 명령으로 변경했음을 의미합니다. 내가 처음에 기대했던

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

지금 출력이 변경 다음과 같습니다 :

6964 false 6963 6964

내 질문이있는 경우이며, 내가 바보 같은 별도의 ID 매핑을 사용하여이 버그/문제를 해결 할 수 있었다 이것은 버그가 아니며, 줄리아가 le, riabundants 사이의 등가 관계를 유지하는 이유는 무엇입니까? 또한, 누구든지이 동작을 재현 할 수 있습니까? 나는 Julia "Version 0.3.0-rc3 + 14 (2014-08-13 16:01 UTC)"를 우분투 14.04에서 사용하고 있습니다.

+0

하나의 배열 만 있습니다. 많은 참조를 만들고있는 중입니다. 관련 항목 : http://julia.readthedocs.org/ko/latest/manual/faq/#i-passed-an-argument-x-to-a-function-modified-it-inside-that-function-but-on - 외부 변수 인 x는 여전히 변하지 않은 이유입니다. – StefanKarpinski

답변

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를 사용할 수 있습니다.