全美商学院
新闻
新闻

递归在成都网站建设中是如何工作的

2019
02/15
17:14
全美网络官网
分享

成都网站建设开发人员经常使用算法将问题分解为更容易解决的更小的块。这种分而治之的方法使得为了解决每个问题,您可以多次调用同一个函数来处理每个部分。

网站建设

在编程中,递归发生在方法调用自身时,并在达到基本情况时终止。基本情况是一个条件语句,它执行返回语句而不是再次调用相同的函数,结束循环。递归的典型用途包括分而治之算法和解决连续出现的问题,例如计算斐波那契数列或阶乘。

在这篇文章中,我们将讨论成都网站建设中的递归,以及如何编写计算数字阶乘的递归方法。您将了解如何在成都网站建设中使用递归,何时比其他方法更好,以及实现递归函数时的最佳实践。

在成都网站建设中使用递归

Java 中用于递归的代码相对简单,尤其是与迭代方法相比。递归可以帮助您编写使用更少内存的软件,因为一旦函数返回,变量就会被删除。递归函数是纯函数,这意味着它们的输出仅取决于它们的输入参数。

递归和阶乘

了解成都网站建设中递归的最简单方法之一是检查打印数字阶乘的函数。

您可以通过将一个数乘以所有小于它本身的正整数来计算阶乘。在本节中,您将看到递归代码与基于循环的代码之间的比较。

例如,5 的阶乘为 120,可以这样表示:

阶乘 (5) = 5 * (4 * (3 * (2 * 1)))

请注意这是如何形成一个级数的:5 的阶乘等于 5 乘以 4 的阶乘,4 乘以 3 的阶乘,依此类推。递归的基本情况是 0。当输入参数达到 0 时,您将从方法主体返回 1。

使用循环的阶乘

以下函数计算作为参数传递的数字的阶乘——一次使用 For 循环,然后再次使用递归。在主入口点调用此方法并传递一个参数。您可以通过提供 5 作为输入参数来对此进行测试,程序返回 120。

您可以使用 For 和 While 循环在成都网站建设中执行阶乘。

处理边缘情况

在构建递归函数时,您可以添加边缘情况来缩短递归。如果下一个递归调用将是基本情况,则进行短路测试。您可以在数字等于或小于 0 时返回 2 并开始递归,而不是仅在数字等于或小于 0 时返回 1。

请记住,短路需要编写一个包装函数来对参数执行条件检查。这通常是不鼓励的,因为包装器的价值需要更高。

为了处理短路,向类中添加一个新的成员方法作为递归函数的包装器。包装函数 factorial 调用内部方法factorialRecursive开始递归。此代码具有相同的输出,但在执行过程中又跳过了一步,因为当数字变为 2 时它会短路。

递归的优缺点

现在让我们使用“递归和阶乘”部分中的方法来研究决定递归和非递归方法的一些因素。

递归的优点

在成都网站建设中,递归以多种方式提高性能,包括:

记忆化

Memoization 跳过已经计算输出并存储在内存中的递归情况。这可以防止重复计算,因为存储了输出并提高了软件的性能。这种方法利用缓存来提高使用递归的性能。

查找阶乘的代码使用缓存变量来存储以前使用的值。

此外,递归方法还仅依赖于输入并包含业务逻辑,而没有底层技术方面,例如堆栈管理。这允许工程师编写具有更少内存和更少副作用(方法范围之外的状态更改,例如系统参数)的软件。

此外,它对特定算法很有用,例如树遍历。深度优先搜索算法使用堆栈来执行搜索。因此,您可以将算法编写为递归函数,与迭代方法相比,这更容易编写。例如,比较使用递归和迭代方法的前序遍历代码。

最后,一些表达式,尤其是在数学运算中使用的表达式,具有特定的符号。这些操作的输入最常见的表示法是前缀、中缀和后缀。固定是操作数在操作中的位置。这允许递归函数轻松复制操作而无需额外的包装器。您可以使用上述表达式从数组构建树,反之亦然。这有助于在一维内存结构(例如 RAM)中表示复杂的数据结构,例如树。

递归的缺点

递归也有其局限性。首先,递归函数反复调用自身,这会导致堆栈因参数溢出而导致程序过早终止。在成都网站建设中,每个程序的堆栈空间都是有限的,而堆的限制则较少。因此,当程序试图使用大量堆栈空间时,它会收到 StackOverflowException,此时程序会继续压入堆栈但不会弹出并达到限制。

另一方面,堆不是后进后出操作 (LIFO),因此程序可以在系统允许的范围内向堆推送尽可能多的数据。

此外,当递归函数执行函数调用作为最后一个语句时,Java 编译器无法优化使用尾递归的递归方法。相反,递归函数将函数调用作为头递归中的第一条语句执行。

“处理边缘情况”部分中的代码演示了没有一个函数是尾递归。factorialRecursion 是非尾递归(不要与头递归混淆),因为它作为函数的结果运行。

此方法使用一个变量来存储所有数字的乘积。它运行一个循环,该循环从我设置为2的变量开始并返回产品。请注意,大于 2 的数字必须相乘,直到i等于数字参数本身。当满足循环条件时,迭代停止。

迭代风格使得定义迭代计数、内存管理和计算停止的时间变得更加容易。这也允许更好地控制堆栈增长。它有助于避免成都网站建设程序中的 StackOverflowException。

同样,迭代方法不需要包装函数。因此,它们避免了任何不需要的额外堆栈输入。这就是为什么通常不鼓励通过缩短递归来获得一次性性能改进的原因。

然而,对于基于序列的问题,例如计算阶乘或斐波那契数列,迭代方法通常更难编写。递归通常会产生一种更优雅的方法,它可以用更少的代码行产生相同的结果。

递归最佳实践

在递归函数中,处理所有可能的边缘情况以从递归函数返回。如果您不处理边缘情况,您的递归可能会永远运行,导致您的程序由于 StackOverflowException 错误而过早终止。递归中的短路并不总是最好的方法,因为您通常必须围绕递归函数编写包装函数。代替短路包装函数,对递归方法内部的边缘情况和函数可以接受的参数应用条件检查。

此外,请记住堆栈不会跟踪已处理的参数。这会导致您的递归函数重复处理相同的参数。为避免这种重复并降低时间复杂度,您应该始终在处理后使用记忆来存储参数。

递归在成都网站建设中是如何工作的

递归函数允许成都网站建设程序中的代码调用自身,通过对一系列输入参数运行相同的操作来计算输出。所涵盖的示例只是其实际应用的一小部分。Java 软件开发工具包 (SDK) 中的各种搜索和排序算法都使用递归,包括深度优先搜索、归并排序和树遍历。

这并不是说递归是万能的方法,尤其是在内存有限的情况下。在这种情况下,建议使用迭代方法来编写函数。这使得解决方案更具可扩展性并且不易发生内存溢出。

然而,递归使成都网站建设的软件工程师能够利用函数式编程的最佳实践并将它们应用于面向对象的编程而没有副作用。这是一种更聪明的方法,而不是更难。

联系我们
欢迎来到全美,免费
获取专业网站建设方案
电话咨询:

18140041855

您还可以预约资深顾问
隐私信息保护中,请放心填写

在线客服

电话咨询

微信咨询

微信号复制成功
18140041855 (苏女士)
打开微信,粘贴添加好友,免费询价吧