ジュリアで可変引数関数を定義する方法
概要 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