Main Content

出力変数は実行時再帰の呼び出し前に割り当てなければならない

問題

次のエラー メッセージが表示されます。

ランタイム再帰呼び出しの前に、すべての出力を割り当てなければ
なりません。ここで出力 '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 の前に rec1rec2 を呼び出します。

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 = 0if ブロックで発生し、再帰呼び出しが 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

関連するトピック