递归函数的代码生成
为了生成 MATLAB® 递归函数的代码,代码生成器使用编译时递归或运行时递归。您可以通过修改您的 MATLAB 代码来影响代码生成器是使用编译时递归还是运行时递归。请参阅Force Code Generator to Use Run-Time Recursion。
当您在用于代码生成的 MATLAB 代码中使用递归函数时,必须遵守某些限制。请参阅用于代码生成的递归函数限制。
编译时递归
使用编译时递归,代码生成器会在生成的代码中创建递归函数的多个版本。每个版本的输入都具有针对该版本自定义的值或大小。这些版本称为函数特化。通过查看代码生成报告或生成的 C 代码,您可以知道代码生成器使用了编译时递归。以下是报告中显示的编译时递归的示例。
有时,由于优化,函数特化不会出现在 C/C++ 代码中。以如下函数为例:
function y = foo() %#codegen x = 10; y = sub(x); end function y = sub(x) coder.inline('never'); if x > 1 y = x + sub(x-1); else y = x; end end
在代码生成报告中的函数列表选项卡上,您可以看到 MATLAB 函数 sub
的函数特化。
然而,C 代码不包含特化。它包含一个返回值为 55 的函数。
运行时递归
使用运行时递归,代码生成器会在生成的代码中生成递归函数。通过查看代码生成报告或生成的 C 代码,您可以知道代码生成器使用了运行时递归。以下是报告中显示的运行时递归的示例。
禁止递归
在代码生成配置对象中,将
CompileTimeRecursionLimit
配置参数设置为 0。在 MATLAB Coder™ 中,将编译时递归限制设置的值设置为 0。
禁用运行时递归
有些编码标准(例如 MISRA™)不允许递归。要提高生成符合 MISRA C™ 的代码的可能性,请禁用运行时递归。
在代码生成配置对象中,将
EnableRuntimeRecursion
设置为false
。在 MATLAB Coder 中,将启用运行时递归设置为否。
如果您的代码需要运行时递归但运行时递归被禁用,则必须重写代码,以便它能够使用编译时递归或不使用递归。
用于代码生成的递归函数限制
在用于代码生成的 MATLAB 代码中使用递归时,请遵循以下限制:
在运行时递归函数中进行第一次递归调用之前,为该函数的所有输出赋值。
为运行时递归函数的元胞数组输出的所有元素赋值。
运行时递归函数的输入和输出不能是类。
对于运行时递归,最大堆栈使用量设置被忽略。