2013-02-18 6 views
0

나는 Project Euler에서 작업하고 있는데, 요점은 그렇다. 나는 피보나치 시퀀스를 출력하기위한 빠른 코드를 작성 중이다. 실제로 프로젝트 eueler 방정식에 대해 서로 다른 코드를 가지고 있지만, 본질적으로 내가 사용하고있는 알고리즘이 한동안 나를 erking했다왜이 코드는 'x, y = y, x + y 형식'대신 'x = y; y = x + y '?

x = 1 
y = 0 
while x < 4000000: 
    print x 
    x = y 
    y = x + y 

,이 일을해야합니다. 그런 다음 조금 연구를하고 사실상 동일한 코드를 찾았지만 형식이 조금 다릅니다. 그리고 효과가있었습니다! 유일한 차이점은 x 및 y 지정을 쉼표로 구분하여 한 줄에 넣는 것입니다. 그래서 그것을 시도 :

x , y = 1 , 0 
while x < 4000000: 
    print x 
    x,y = y, x + y 

분명히 말했듯이, 그것은 효과가있다. 이것은 두 가지 사이의 차이가 무엇인지 알 수 없기 때문에 나를 괴롭 히고있다. 출력이 다른 이유를 이해할 수 없습니다. 출력이 다른 이유는 무엇입니까?

답변

6

첫 번째 코드에서 :

x = y 
y = x + y 

실제로는 y + yy에 할당하고 있습니다. x의 값은 이미 덮어 씁니다. 그리고 이것은 당신이 옳다고 생각하지 않습니까?


그리고 당신의 두번째 코드에서

:

x, y = y, x + y 

y, 제 1 및 RHS에 x + y이 평가 한 후 평가 값이 LHS에 x, y에 할당됩니다. 따라서 x + y은 첫 번째 경우 에서처럼 x에 새로 할당 된 값의 부작용이 없습니다. 따라서 y에는 x + y 만 있습니다.

따라서 실제 할당이 이루어지기 전에 RHS에있는 두 표기의 evaluation의 경우입니다.

네, while 루프 외부의 할당은 아무런 효과가 없습니다. 그러나 두 번째 방법은 더 매력적입니다.

0

두 번째 버전에서는 y, x+y을 평가할 때 x + y에서 x의 원래 값을 사용합니다. 두 라인 버전

그것이 x+y 평가 X X + Y가 y+y

+0

나는 생각했다을 가정 해 봅시다 똑같은, 마지막 줄을 y = 0 + 0으로 평가할 것을 의미합니다. 나는 당신이 원래 버전의 마지막 줄을 작업 버전의 마지막 줄로 바꾸면 두 버전이 모두 w라고 생각합니다. ould는 예상대로 작동합니다. –

0

넌 X 재 할당과 같은 인 리드 y로 설정하고있다.

하자

케이스 수치 예 보자 1

x = 4 
y = 2 
x = y = 4 
y = x + y = 4 + 4 = 8 

사례 2 :

제 경우 X에 따라서
x = 4 
y = 2 
x, y = y, x + y = 2, 4 + 2 = 2, 6 

4이며, Y는 제 중에, 8 case x는 2이고 y는 6입니다.

0

첫 번째 버전에서 첫 번째 할당은 x 값을 변경합니다.이 값은 다음 줄의 할당 값에 영향을줍니다. 즉, 이미 x를 변경했기 때문에 y = x + yy = y+y과 같습니다.

두 번째 버전에서는 두 개의 할당이 동시에 완료되므로 두 값이 동시에 업데이트됩니다.

0

x = y 줄 이후에 두 번째 줄 (y = x + y)은 y = y + y으로 계산됩니다. 예를 들어, X = 2, Y = 다음 3

, 다른 한편으로

x = y   # i.e. x = 3 now 
y = x + y  # i.e. y = 3 + 3 = 6 (while you wanted it to be 5) 

, 그래서

x, y = y, x + y # this first assigns values to the right hand side 

,

x, y = 3, 2 + 3 # i.e x, y = 3, 5 
관련 문제