Выходная переменная должна быть присвоена перед рекурсивным вызовом во время выполнения

Проблема

Вы видите одно из этих сообщений:

All outputs must be assigned before any run-time
recursive call. Output 'y' is not assigned here.

Simulink does not have enough information to determine output 
sizes for this block
.

Причина

Рекурсия во время выполнения производит рекурсивную функцию в сгенерированном коде. Генератор кода не может использовать рекурсию во время выполнения в рекурсивной функции в вашем коде 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

Косвенный пример рекурсии

В следующем коде, rec1 вызовы rec2 перед присвоением y = 0.

function z = callrec(n)
z = rec1(n);
end

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 z = callrec(n)
z = rec1(n);
end

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

Похожие темы