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

Проблема

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

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

Похожие темы

Для просмотра документации необходимо авторизоваться на сайте