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

Проблема

Вы видите это сообщение об ошибке:

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

Причина

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

Похожие темы

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