[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

10.2 関数の呼び出し

関数は,特定の計算手順に対する名称です。関数には名前がついている ので,プログラムの任意の場所でそれを呼び出すことができます。たとえば, sqrt関数は,ある数の平方根を計算します。

あらかじめ用意されている関数群は,組み込み関数です。これは,どの Octaveプログラムにおいても利用可能であることを意味します。sqrt 関数は,組み込み関数のひとつです。さらに,あなた独自の関数を定義するこ ともできます。これを実行するためのさらなる情報は, 関数とスクリプトファイルを参照してください。

関数を使用するための方法は,関数呼び出し式を使うことです。この式は, 関数名と,それに続くかっこでくくられた引数のリストから構成されます。 その引数は,関数が実行する計算に用いる生の対象物を与える式です。1つ以上 の引数があるとき,それらはカンマで区切ります。もし引数がなければ,カッコ を省略することができます。しかし,関数の呼び出しを行ったということを明確 にするため,いつでもカッコを使うことがよい考えです。いくつかの例を挙げま す。

 
sqrt (x^2 + y^2)      # 1個の引数
ones (n, m)           # 2個の引数
rand ()               # 引数なし

各々の関数ごとに,とるべき引数の数が決まっています。たとえばsqrt 関数は,1個の引数(平方根をとるべき数)をつけて呼び出さなければなりませ ん。

 
sqrt (argument)

組み込み関数の中には,特定の利用法に応じて引数の数を変えるものがありま す。また,その関数の挙動は,与えた引数の数によって異なります。

他の式と同じように,関数の呼び出しは値です。これは与えた引数に基づいて, その関数により計算されたものです。この例において, sqrt (argument)の値は,引数の平方根です。関数は,ある変数に 値を代入したり,入出力を実行したりするような使い方もできます。

大部分の言語とは異なり,Octaveにおける関数は,複数の値を返すことがあり ます。たとえば,

 
[u, s, v] = svd (a)

この式は,行列aの特異値分解を計算し,3つの計算結果の行列をusおよびvに代入します。

複数の代入式の左辺は,それ自体が式になっており,変数名やインデックス式の リストをとることができます。インデックス式および 代入式も参照してください。


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

10.2.1 値による呼び出し

Octaveでは,Fortranとは異なり,関数の引数は値として渡されます。これは, 関数呼び出しにおける各々の引数は,関数に渡される前に評価され,メモリの一 時領域に割り当てられます。現在のところ,引数を値ではなく参照渡しとするよ うに指定する方法はありません。これは,関数呼び出しにおいて,引数の値を直 接変更することは不可能だということです。関数内では,一時的にコピーされた 値のみを変更することはできます。たとえば,以下の関数があります。

 
function f (x, n)
  while (n-- > 0)
    disp (x);
  endwhile
endfunction

この関数は,1番めの引数の値をn回繰り返して表示するものです。この関 数において,変数nは,その値が関数の呼び出し元で変更されることを心配 する必要なく,一時変数として使用されています。その関数が引数を修正しよう としないことを最初に決定する必要なく,どの引数に対しても定数として渡すこ とが常に可能となるため,値渡しは役に立ちます。

呼び出す側は,引数に対する式として変数を使用するでしょうが,呼び出される 関数はこれを知りません。ただ引数のもつ値だけを知るのです。たとえば,以下 のように呼び出される関数があるとします。

 
foo = "bar";
fcn (foo)

あなたは,引数が「fooという変数」であると考えるべきではありませ ん。かわりに,引数が"bar"という文字列値であると考えるべきです。

Octaveは,関数の引数に値渡しを使用していますが,値は必要のない時にはコ ピーされません。たとえば,

 
x = rand (1000);
f (x);

この例では,もし関数fがその引数の値を変更しないのであれば,2つの 1000行1000列の行列を,実際には存在しないようにします。ですから,Octaveは 関数fの範囲外で値を変更することを避けるためにコピーを作らなければ なりません。そうでないとすれば,定数または一時的な結果の値を修正しようと します(そして失敗します)。


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

10.2.2 再帰

いくつかの制限(2)はありますが,関数の再帰呼び出しが許されています。 再帰関数は,直接・間接にそれ自身を呼び出す関数のことです。たとえば, 与えられた整数の階乗を計算する非効率な(3)例を示します。

 
function retval = fact (n)
  if (n > 0)
    retval = n * fact (n-1);
  else
    retval = 1;
  endif
endfunction

この関数は,それ自身を直接呼び出す再帰的関数です。この関数は,自分自身を 呼び出すたびに,以前の呼び出しで用いた値よりも1だけ小さい引数を使用して いるので,最終的には終了します。いちど引数がゼロ以下になれば,この関数は 自分自身を呼び出さずに,再帰は終了します。

組み込み変数max_recursion_depthは,再帰の深さの限界を指定し,Octave が無限回の再帰にはまることを回避します。

Built-in Variable: max_recursion_depth

関数が再帰的に呼び出される回数の限界を決定する。もし限界を超えるならば, エラーメッセージを表示し,トップレベルに制御を戻す。

初期値では256である。


[ < ] [ > ]   [ << ] [ Up ] [ >> ]

This document was generated on July, 20 2006 using texi2html 1.76.