8.2.2 Recursion

Last-modified: 2025-03-22 (土) 20:53:01

8.2.2 再帰

いくつかの制限3付きで、再帰関数呼び出しが許可されます。 再帰関数とは、直接的または間接的に自分自身を呼び出す関数です。たとえば、与えられた整数の階乗を計算する 非効率的な4方法を以下に示します。

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

この関数は、自分自身を直接呼び出すため再帰的です。自分自身を呼び出すたびに、前回の呼び出しで使用された引数より 1 つ少ない引数を使用するため、最終的には終了します。引数が 0 より大きくなくなると、自分自身は呼び出されず、再帰は終了します。

この関数はmax_recursion_depth、再帰の深さの制限を指定するために使用でき、Octave が無限に再帰するのを防ぎます。同様に、この関数は、max_stack_depth再帰的かどうかに関係なく、関数呼び出しの深さの制限を指定するために使用できます。これらの制限は、Octave が実行されているコンピュータでのスタック オーバーフローを防ぐのに役立ちます。そのため、シグナルで終了する代わりに、インタープリタはエラーをスローしてコマンド プロンプトに戻ります。

: val = max_recursion_depth ()

: old_val = max_recursion_depth (new_val)

: old_val = max_recursion_depth (new_val, "local")

関数が再帰的に呼び出される回数の内部制限を照会または設定します。

制限を超えると、エラー メッセージが出力され、制御は最上位レベルに戻ります。

オプションを使用して関数内から呼び出されると"local"、関数とそれが呼び出すサブルーチンに対して変数がローカルに変更されます。関数を終了すると、元の変数値が復元されます。
See also: max_stack_depth.

: val = max_stack_depth ()

: old_val = max_stack_depth (new_val)

: old_val = max_stack_depth (new_val, "local")

関数が再帰的に呼び出される回数の内部制限を照会または設定します。

制限を超えると、エラー メッセージが出力され、制御は最上位レベルに戻ります。

オプションを使用して関数内から呼び出されると"local"、関数とそれが呼び出すサブルーチンに対して変数がローカルに変更されます。関数を終了すると、元の変数値が復元されます。

See also: max_recursion_depth.

脚注
(3)
Octave の関数の一部は、再帰的に呼び出すことができない関数として実装されています。たとえば、ODE ソルバーは、lsode最終的には再帰的に呼び出すことができない Fortran サブルーチンで実装されているため、必要なlsode ユーザー提供の関数内から直接または間接的に呼び出すことはできませんlsode。呼び出すとエラーが発生します。

(4)
値が実際に正の整数であることを最初に確認した後でprod (1:n)、代わりに またはを使用する方がはるかに適切です。gamma (n+1)n