输出变量必须在运行时递归调用之前赋值
问题
您会看到以下错误消息:
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