줄리아에서 우아한 반복문을 사용하는 방법

줄리아에서 우아한 반복문을 사용하는 방법

How to Write Elegant Loop in julia

가이드

while

while 문은 여타 언어들과 다를 게 없다.

julia> while x < 10
           x += 1
           print("$x - ")
       end
1 - 2 - 3 - 4 - 5 - 6 - 7 - 8 - 9 - 10 -

for

julia> for i in 1:10
           print("$i - ")
       end
1 - 2 - 3 - 4 - 5 - 6 - 7 - 8 - 9 - 10 -

julia> for i = 1:10
           print("$i - ")
       end
1 - 2 - 3 - 4 - 5 - 6 - 7 - 8 - 9 - 10 - 

julia> for i  1:10
           print("$i - ")
       end
1 - 2 - 3 - 4 - 5 - 6 - 7 - 8 - 9 - 10 -

줄리아에서 메이저하게 쓰이는 반복문 스타일은 위 세가지가 있다. 가장 위는 R파이썬에서 쓰는 방법과 비슷하며, 두번째는 매트랩과 비슷하다. 가장 우아한 표현은 세번째의 집합 포함 기호를 사용한 방법이다.

중첩반복문

다음에 나타나는 두 반복문은 기능적으로 완전히 같다.

julia> X = 1:4; Y = 8:(-1):5;

julia> for x  X
           for y  Y
               print("  ($x + $y) = $(x + y)")
               if y == 5 println() end
           end
       end
  (1 + 8) = 9  (1 + 7) = 8  (1 + 6) = 7  (1 + 5) = 6
  (2 + 8) = 10  (2 + 7) = 9  (2 + 6) = 8  (2 + 5) = 7
  (3 + 8) = 11  (3 + 7) = 10  (3 + 6) = 9  (3 + 5) = 8
  (4 + 8) = 12  (4 + 7) = 11  (4 + 6) = 10  (4 + 5) = 9

julia> for x  X, y  Y
           print("  ($x + $y) = $(x + y)")
           if y == 5 println() end
       end
  (1 + 8) = 9  (1 + 7) = 8  (1 + 6) = 7  (1 + 5) = 6
  (2 + 8) = 10  (2 + 7) = 9  (2 + 6) = 8  (2 + 5) = 7
  (3 + 8) = 11  (3 + 7) = 10  (3 + 6) = 9  (3 + 5) = 8
  (4 + 8) = 12  (4 + 7) = 11  (4 + 6) = 10  (4 + 5) = 9

마치 의사 코드Pseudo Code를 쓰듯 코드가 작성된 것을 볼 수 있다. 주의사항으로는 다음과 같이 반복자Iterator로써 튜플을 준 경우다.

julia> for (x,y)  (X, Y)
           print("  ($x + $y) = $(x + y)")
           if y == 5 println() end
       end
  (1 + 2) = 3  (8 + 7) = 15

직관적으로 생각했을 때 위 반복문은 (X, Y)X 에서 x 를 뽑고 Y 에서 y 를 뽑으며 돌아야할 것 같지만, 실제로는 X 에서 두 개의 원소 1,2Y 에서 두 개의 원소 8,7 을 뽑으며 돌았다. 만약 이렇게 순서를 맞춰서 뽑고 싶다면 다음과 같이 zip() 함수를 사용하면 된다.

julia> for (x,y)  zip(X, Y)
           print("  ($x + $y) = $(x + y)")
           if y == 5 println() end
       end
  (1 + 8) = 9  (2 + 7) = 9  (3 + 6) = 9  (4 + 5) = 9
댓글