줄리아에서 가변 인자 함수 정의하는 법

줄리아에서 가변 인자 함수 정의하는 법

How to Define Varargs Function in julia

개요 1

가변인자 함수란 보통 프로그래밍에서 Varargs Function이라 불리는 것으로, 복수의 인자가 제한 없이 들어올 수 있는 함수를 말한다. 줄리아에서는 간단히 변수 뒤에 ...을 찍는 것으로 가변 인자를 정할 수 있다. 예제 코드를 보고 이해해보자.

참고로 이 ...스플랫 오퍼레이터Splat Operator 라 부른다.2

코드

아이작 뉴턴은 간단히 팩토리얼의 역수를 더하면 $e$ 에 수렴하는 다음의 정리를 발견했다. $$ e = {{ 1 } \over { 0! }} + {{ 1 } \over { 1! }} + {{ 1 } \over { 2! }} + \cdots = \sum_{k=0}^{\infty} {{ 1 } \over { k! }} $$ 이 예제에서는 오일러 상수 $e = 2.71828182 \cdots$ 로 수렴하는 수열을 보려고 한다.

function f(x...)
    zeta = 0
    for x_ in x
        zeta += 1/prod(1:x_)
    end
    return zeta
end

위와 같이 x 뒤에 점을 찍어 x...라 쓰면 주어지는 인자들을 알아서 배열로 생각해준다. 함수의 내용은 위 수식에서 보이는바와 같이 순서대로 팩토리얼의 역수를 취해 더해서 리턴하는 게 전부다.

julia> f(0)
1.0

julia> f(0,1)
2.0

julia> f(0,1,2)
2.5

julia> f(0,1,2,3,4,5,6,7,8,9,10)
2.7182818011463845

실행결과는 위와 같이 자연수를 길게 줄수록 오일러 상수에 가까워지는 것을 확인할 수 있다. 여기서 주목할 점은 가변적으로 들어간 인자들이 알아서 x라는 배열로 묶여서 사용되었다는 점이다. 예컨대 다음과 같이 개념적으로 배열을 집어넣으면 에러를 낼 수 있다.

julia> f(0:10)
ERROR: MethodError: no method matching (::Colon)(::Int64, ::UnitRange{Int64})

환경

  • OS: Windows
  • julia: v1.6.3

  1. https://docs.julialang.org/en/v1/manual/functions/#Varargs-Functions ↩︎

  2. https://docs.julialang.org/en/v1/base/base/#... ↩︎

댓글