logo

ジュリアで可変引数関数を定義する方法 📂ジュリア

ジュリアで可変引数関数を定義する方法

概要 1

可変引数関数とは、プログラミングで一般にVarargs Functionと呼ばれるもので、複数の引数を制限なく受け入れることができる関数のことだ。Juliaでは、変数の後ろに...を付けることで簡単に可変引数を設定できる。例のコードを見て理解しよう。

ちなみに、この...スプラットオペレータ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