Main Content

再帰関数のコード生成

再帰 MATLAB® 関数のコードを生成するために、コード ジェネレーターはコンパイル時の再帰または実行時の再帰を使用します。MATLAB コードを修正して、コード ジェネレーターでコンパイル時または実行時の再帰を使用するかどうかを制御できます。コード ジェネレーターで実行時の再帰を強制的に使用させるを参照してください。

コンフィギュレーション パラメーターを修正して、再帰が許可されないようにするか、実行時の再帰を無効にすることができます。

コード生成用に MATLAB コードで再帰関数を使用する場合は、特定の制限事項に従わなければなりません。コード生成における再帰関数の制限事項を参照してください。

コンパイル時の再帰

コンパイル時の再帰では、コード ジェネレーターによって生成されたコードに複数のバージョンの再帰関数が作成されます。各バージョンへの入力の値とサイズは、そのバージョンに合わせてカスタマイズされます。これらのバージョンは、"関数の特殊化" として知られています。コード ジェネレーターがコンパイル時の再帰を使用したかどうかは、コード生成レポートまたは生成された C コードを確認することで判断できます。レポート内のコンパイル時の再帰の例は次のとおりです。

This image shows the results of compile-time recursion in the MATLAB Function report

最適化が原因で関数の特殊化が C/C++ コードに表示されないことがあります。たとえば、以下の関数を考えます。

function y = foo()
%#codegen
    x = 10;
    y = sub(x);
end

function y = sub(x)
coder.inline('never');
if x > 1
    y = x + sub(x-1);
else
    y = x;
end
end

コード生成レポートの [関数リスト] タブに、MATLAB 関数 sub の関数の特殊化が表示されます。

This image shows the results in the MATLAB Function report for the function foo. The report also shows the function specializations for MATLAB function sub

ただし、C コードに関数の特殊化は含まれません。このコードには値 55 を返す 1 つの関数が含まれます。

実行時の再帰

実行時の再帰では、コード ジェネレーターによって生成されたコードに再帰関数が生成されます。コード ジェネレーターが実行時の再帰を使用したかどうかは、コード生成レポートまたは生成された C コードを確認することで判断できます。レポート内の実行時の再帰の例は次のとおりです。

This image shows an example of a run-time recursion in the report

再帰を許可しない

  • コード生成構成オブジェクトで、CompileTimeRecursionLimit 構成パラメーターを 0 に設定します。

  • MATLAB Coder™ アプリで、[コンパイル時の再帰限界値] 設定の値を 0 に設定します。

実行時の再帰を無効にする

MISRA™ などの一部のコーディング標準では、再帰は許可されません。MISRA C™ に準拠したコードを生成する可能性を高めるには、実行時の再帰を無効にします。

  • コード生成構成オブジェクトで、EnableRuntimeRecursionfalse に設定します。

  • MATLAB Coder アプリで、[実行時の再帰を有効にする][いいえ] に設定します。

実行時の再帰が必要なコードで実行時の再帰が無効にされた場合、コンパイル時の再帰を使用するか、再帰を使用しないようにコードを書き換えなければなりません。

コード生成における再帰関数の制限事項

コード生成用に MATLAB コードで再帰を使用する場合は、次の制限事項に従ってください。

  • 関数内で最初の再帰呼び出しの前に、ランタイム再帰関数のすべての出力を代入する。

  • ランタイム再帰関数の cell 配列出力のすべての要素を代入する。

  • ランタイム再帰関数の入力と出力をクラスにすることはできない。

  • 最大スタック使用量の設定は実行時の再帰で無視される。

関連するトピック