主要内容

递归函数的代码生成

生成递归代码的MATLAB®函数,代码生成器使用编译时递归运行时递归.您可以通过修改MATLAB代码来影响代码生成器是使用编译时递归还是运行时递归。看到强制代码生成器使用运行时递归

你可以不允许递归禁用运行时递归通过修改配置参数。

在MATLAB代码中使用用于代码生成的递归函数时,必须遵守某些限制。看到代码生成的递归函数限制

编译时递归

使用编译时递归,代码生成器在生成的代码中创建递归函数的多个版本。每个版本的输入都有针对该版本定制的值或大小。这些版本被称为功能专门化通过查看代码生成报告或生成的C代码,可以判断代码生成器使用了编译时递归。下面是报告中的编译时递归示例。

有时候,由于优化,函数专门化不会出现在C/ c++代码中。例如,考虑下面这个函数:

函数y = foo ()% # codegenx = 10;y =子(x);结束函数Y = sub(x) code .inline(“永远”);如果X > 1 y = X + (X -1);其他的y = x;结束结束

在代码生成报告中函数列表选项卡,可以看到MATLAB函数的函数专门化

但是,C代码不包含专门化。它包含一个返回值55的函数。

运行时递归

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

不允许递归

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

  • MATLAB编码器™的值编译时递归限制设置为0。

禁用运行时递归

一些编码标准,如MISRA®,不允许递归。增加生成符合MISRA C的代码的可能性®,禁用运行时递归。

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

  • MATLAB编码器应用程序,启用运行时递归没有

如果您的代码需要运行时递归,并且禁用了运行时递归,那么您必须重写代码,以便使用编译时递归或不使用递归。

代码生成的递归函数限制

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

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

  • 分配运行时递归函数的单元格数组输出的所有元素。

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

  • 最大堆栈的使用为运行时递归忽略设置。

相关的话题