主要内容

输出变量必须在运行时递归调用之前赋值

问题

您会看到以下错误消息:

All outputs must be assigned before any run-time recursive call.Output 'y' is not assigned here.(在任何运行时递归调用之前,必须对所有输出赋值。此处未对输出 '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

间接递归示例

在以下代码中,rec1 在赋值 y = 0 之前调用 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

另请参阅

主题