Main Content

递归函数的代码生成

为了生成 MATLAB® 递归函数的代码,代码生成器使用编译时递归运行时递归。您可以通过修改您的 MATLAB 代码来影响代码生成器是使用编译时递归还是运行时递归。请参阅Force Code Generator to Use Run-Time Recursion

您可以通过修改配置参数来禁止递归禁用运行时递归

当您在用于代码生成的 MATLAB 代码中使用递归函数时,必须遵守某些限制。请参阅用于代码生成的递归函数限制

编译时递归

使用编译时递归,代码生成器会在生成的代码中创建递归函数的多个版本。每个版本的输入都具有针对该版本自定义的值或大小。这些版本称为函数特化通过查看代码生成报告或生成的 C 代码,您可以知道代码生成器使用了编译时递归。以下是报告中显示的编译时递归的示例。

This image shows the results of compile-time recursion in the MATLAB Function report

有时,由于优化,函数特化不会出现在 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 的函数特化。

This image shows the results in the MATLAB Function report for the function foo. The report also shows the function specializations for MATLAB function sub

然而,C 代码不包含特化。它包含一个返回值为 55 的函数。

运行时递归

使用运行时递归,代码生成器会在生成的代码中生成递归函数。通过查看代码生成报告或生成的 C 代码,您可以知道代码生成器使用了运行时递归。以下是报告中显示的运行时递归的示例。

This image shows an example of a run-time recursion in the report

禁止递归

  • 在代码生成配置对象中,将 CompileTimeRecursionLimit 配置参数设置为 0。

  • MATLAB Coder™ 中,将编译时递归限制设置的值设置为 0。

禁用运行时递归

有些编码标准(例如 MISRA™)不允许递归。要提高生成符合 MISRA C™ 的代码的可能性,请禁用运行时递归。

  • 在代码生成配置对象中,将 EnableRuntimeRecursion 设置为 false

  • MATLAB Coder 中,将启用运行时递归设置为

如果您的代码需要运行时递归但运行时递归被禁用,则必须重写代码,以便它能够使用编译时递归或不使用递归。

用于代码生成的递归函数限制

在用于代码生成的 MATLAB 代码中使用递归时,请遵循以下限制:

  • 在运行时递归函数中进行第一次递归调用之前,为该函数的所有输出赋值。

  • 为运行时递归函数的元胞数组输出的所有元素赋值。

  • 运行时递归函数的输入和输出不能是类。

  • 对于运行时递归,最大堆栈使用量设置被忽略。

相关主题