出力変数は実行時再帰の呼び出し前に割り当てなければならない
問題
次のエラー メッセージが表示されます。
ランタイム再帰呼び出しの前に、すべての出力を割り当てなければ なりません。ここで出力 'y' が割り当てられていません。
原因
実行時再帰によって、生成されたコードに再帰関数が作成されます。最初の再帰呼び出しの前に出力が代入されていないため、コード ジェネレーターは MATLAB® コードの再帰関数に実行時再帰を使用できません。
解決法
再帰呼び出しの前に出力が代入されるようコードを書き換えてください。
直接再帰の例
次のコードでは、ステートメント y = A(1)
で値が出力 y
に代入されます。このステートメントは、再帰呼び出し y = A(1)+ mysum(A(2:end))
の後に発生します。
function z = call_mysum(A) B = A; coder.varsize('B'); z = mysum(B); end function y = mysum(A) coder.inline('never'); if size(A,2) > 1 y = A(1)+ mysum(A(2:end)); else y = A(1); end end
代入 y = A(1)
が if
ブロックで発生し、再帰呼び出しが else
ブロックで発生するようコードを書き換えます。
function z = call_mysum(A) B = A; coder.varsize('B'); z = mysum(B); end function y = mysum(A) coder.inline('never'); if size(A,2) == 1 y = A(1); else y = A(1)+ mysum(A(2:end)); end end
あるいは、if
ブロックの前に y = 0
のように代入を追加します。
function z = call_mysum(A) B = A; coder.varsize('B'); z = mysum(B); end function y = mysum(A) coder.inline('never'); y = 0; if size(A,2) > 1 y = A(1)+ mysum(A(2:end)); else y = A(1); end end
間接再帰の例
次のコードでは、代入 y = 0
の前に rec1
が rec2
を呼び出します。
function y = rec1(x) %#codegen if x >= 0 y = rec2(x-1)+1; else y = 0; end end function y = rec2(x) y = rec1(x-1)+2; end
rec1
で代入 y = 0
が if
ブロックで発生し、再帰呼び出しが else
ブロックで発生するよう、このコードを書き換えます。
function y = rec1(x) %#codegen if x < 0 y = 0; else y = rec2(x-1)+1; end end function y = rec2(x) y = rec1(x-1)+2; end