分享

函数递归 | matlab基础

 小温爱怡宝 2023-07-22 发布于江西

7.7 递归

许多(数学)函数都是递归定义的,也就是说,就其本身的简单情况而言,例如,阶乘函数可以递归定义为

MATLAB允许函数调用自己;这个过程被称为递归。阶乘函数可以递归地写入到 m文件中。如下所示:

function y = fact(n)
% FACT Recursive definition of n!
if n > 1
y=n * fact(n-1);
else
y = 1;
end;

递归函数通常是这样写的:if语句处理一般递归定义;else部分处理特殊情况(n = 1)。

尽管递归看似简单,但它是一个高级主题,如下面的实验所示。将语句disp(n)插入if语句上方的fact定义中,并从命令行运行fact(5)。效果正如您所期望的:整数5到1按降序排列。现在将disp(n)移到if语句下面,看看会发生什么。结果是整数1到5现在按升序排列,这是相当令人惊讶的。

在第一种情况下,每次调用fact时都会显示n的值,并且输出足够明显。然而,调用递归函数和执行递归函数之间存在着天壤之别。

在第二种情况下,disp语句只在if语句执行完毕后才执行。具体是什么时候?当对fact的初始调用发生时,n的值为5,因此调用if中的第一条语句.

然而,在这个阶段,fact(4)的值是未知的,因此,函数中所有语句的副本将在fact(4)的值已知时执行。对fact(4)的引用使fact调用自己,这一次n的值为4。

再次调用if中的第一条语句,MATLAB发现它这次不知道fact(3)的值。因此,一旦知道fact(3)的值,就必须执行的所有语句的另一个(不同的)副本。

因此,每次调用fact时,将为所有有待执行的语句创建单独的副本。最后,MATLAB高兴地找到一个值n(1),它实际上知道事实的值,所以它终于可以开始执行(以相反的顺序)在内存中堆积的语句。

这个讨论说明了应该尊重递归的观点。虽然在这样的例子中使用它是完美的,但它会消耗大量的计算机内存和时间。

    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多