関数の作り方

Julia で関数を定義するとき、関数の処理を functionend で囲む。

例えば、変数 xy を受け取り、その合計値を返す関数 plus を以下のように定義することができる。

function plus(x, y)
    z = x + y
    return z
end

関数を呼び出すときは関数名に括弧をつける。plus 関数を定義するとき、引数として 2 つ定義した。そのため、1 つしか与えないとエラーが起こる。

plus(1, 2)
## 3

plus(1)
## ERROR: `plus` has no method matching plus(::Int64)

関数を定義するとき、引数の初期値も合わせて定義することができる。

function plus(x = 10, y = 20)
    z = x + y
    return z
end

plus()
## 30

plus(1)
## 21

しかし、上記のように関数を定義すると、x の値を省略して、y の値を与えるようなことはできない。そこで、関数を定義するときに、引数のところに ; をつける。これにより、 ; よりも前にある引数は順番通りに与えないといけなくて、; より後の引数は必ず引数の名前とともに値を与えなくてはならない。。

function plus(; x = 10, y = 20)
    z = x + y
    return z
end

plus(y = 2)
## 12

plus(y = 2, x = 3)
## 5
function f(a = 1, b = 2; x = 10, y = 20)
    c = a - b
    z = x + y
    return c * z
end

f(2, 4, 6, 8)
## ERROR: `f` has no method matching f(::Int64, ::Int64, ::Int64, ::Int64)

f(2, 4, x = 6, y = 8)
## -28

f(x = 11, y = 22)
## -33

複数個の値を返したい場合は、タプル(一度作成すると後から変更できない配列)にまとめて返すことができる。

function f(a, b, x, y)
    c = a - b
    z = x + y
    w = (c, z)
    return w
end

p, q = f(10, 1, 10, 1)
p
## 9
q
## 11

関数が引き受ける引数の数が決まっていない場合は、args... を引数としてかけば、引数の数を可変にすることができる。

function g(a, b, args...)
    c = a + b
    s = 1
    if length(args) > 0
        s = sum(args)
    end
    return c * s
end

g(1, 2)
## 3

g(1, 2, 3)
## 9

g(1, 2, 3, 4)
## 21

再帰処理

関数の中で自分自身を呼び出す再帰処理の場合は、以下のフィボナッチ数列を求める関数の例のように、自分自身がすでに定義しているものとして利用する。

function fib(n)
  if n > 1
    return fib(n - 1) + fib(n - 2)
  else
    return 1
  end
end


fib(5)
## 8

References