递归算法是程序员的最重要的基本功之一,也是相对比较难理解的一种;尤其是当今框架盛行,自己不愿/不需要思考的编程年代,递归是检验程序员级别的方法之一。其实不要怕,它很简单,就是方法调用方法而已,只不过方法时调用自己而已(或是曲折调自己),不就是如此吗?
写出递归的程序需要什么?抽象!对,就是抽象,不要以为抽象是面向对象编程的专有名词。碰到问题时先不要考虑具体的细节,陷入森林之中,先找规律,从具体问题中找出一般规律。比如汉诺塔游戏,如果你按常规思路,按步骤一步一步思考,你根本就没有出路,而如果你抽象出“把最上面的盘子移到第二根柱子上,然后把剩下的移到第三个柱子上,最后把最上面的盘子也移到第三根柱子上”,这个问题就非常简单、明了了。
开始写递归时,第一要考虑的是什么?是出口条件,就是什么情况下能得到最终结果并回朔。这个首先要考虑的。这样有三个好处,第一,简单,因为出口条件往往是简单的;第二,得到递归方法的参数,那些参数是需要递归传进来的,你就分析清楚了;第三,递归的其他逻辑部分,也就有了努力的方向,知道递归要什么参数,知道怎么样正确跑出递归。所以出口条件是最重要的,如果这个还没考虑清楚,说明你问题还没有理顺,先不要动手。
递归传参数时,需要注意什么?如Java是面向对象,有传值,传引用之别;如果你传个简单类型(包括String),那不要担心递归中,这个值会变,如果是对象(比如你可能传过List,对吗),这个就要注意了。当然传什么没有什么好不好的问题,要看实际需要。
递归还需要注意什么,超级复杂的递归算法(一般我们不会碰到),要注意栈空间足够,因为如果一个方法调需要用自己10W次,要保存多少信息到栈中? 提醒而已,就算碰到也会有异常提示。改改JVM参数即可。
我们需要递归吗?需要,也许不经常需要,但是需要时会让你不知所错;所以递归是需要,不常需要但很重要。
好好学习,天天向上,打好基础,万剑归尊。
----------------------------------------------------------------------
张瑜,Mybeautiful,
zhangyu0182@sina.com
推荐阅读:
分享到:
相关推荐
虽然递归在构建树形结构时非常有用,但也需要注意避免无限递归的情况发生。在上面的例子中,`AddReplies`方法最终会因为没有满足过滤条件的数据行而自然停止递归。然而,在实际开发中,应当确保递归逻辑的健壮性,...
同时,调试递归代码可能较为困难,因为调用链较长,因此良好的日志记录和测试也是必要的。 总之,递归算法是.NET开发中不可或缺的一部分,它能够优雅地解决许多复杂问题。然而,使用递归时需谨慎,以免引入不必要的...
阿克曼函数的增长速度极快,以至于即使是较小的输入也会导致巨大的输出。例如,`A(4, 2)`的值就已经超过了大多数编程语言中的整数类型的最大值。因此,在实际应用中,阿克曼函数并不常见,更多地被用作理论分析和...
2. 递归算法递归越深,占用栈空间也就越多,相对而言,非递归占用的栈空间少。效率比较高。 递归算法和非递归算法的转换: 递归算法和非递归算法可以相互转换。将递归算法转换为非递归算法有两种方法,一种是直接...
### 可并行递归算法的递归多线程实现:深入解析 #### 引言:多线程与并行处理的重要性 随着计算任务日益复杂,传统的单线程编程模型已无法满足高效处理大规模数据的需求。多线程编程作为一种提高程序并发性和性能...
在题目中提到的第一点,如果递归函数没有递归结束的语句,即没有定义基本情况,那么函数会不断地调用自身而无法停止,导致无穷递归,最终可能引发“栈溢出”错误,也就是我们常说的“死循环”。因此,编写递归函数时...
### ABAP简单递归算法解析 #### 一、引言 ABAP(Advanced Business ...通过上述分析,我们不仅了解了递归算法的工作机制,也熟悉了ABAP中递归函数的实现方法,这对于进一步学习和应用ABAP编程具有重要意义。
在ACM(国际大学生程序设计竞赛)中,递归算法是一种常见的解决问题的方法,它通过函数自身调用自身来实现问题的解决。递归的核心在于找到基本情况(base case),即可以直接求解的问题,以及每次递归调用时问题规模...
同时,这也为理解递归函数的优化提供了很好的实例,这对于任何计算机科学的学习者来说都是非常宝贵的经验。在实际编程中,理解和掌握如何有效地处理递归问题,尤其是在资源有限的情况下,是至关重要的技能。
掌握递归对于计算机科学的学生来说至关重要。递归不仅仅是C++语言中的一个特性,它是一种解决问题的思维方式,广泛应用于算法设计、数据结构、计算理论等多个领域。通过递归,可以简洁地表达和实现复杂的算法,例如...
空间复杂度方面,非递归实现主要取决于分区操作和栈的使用,而递归实现则依赖于递归深度,一般情况下都是O(log n)。 在实际编程中,可以根据具体需求选择非递归或递归实现。非递归版本更适合内存有限或者递归深度...
总结来说,"CRP.zip_CRP_CRP递归图_matlab 递归图_递归 MATLAB_递归分析"这个主题强调了使用MATLAB进行递归分析的重要性。通过理解和应用递归图,开发者可以更好地理解递归函数的行为,优化代码性能,以及解决潜在的...
总的来说,将递归算法转换为非递归算法需要深入理解问题的本质,找到合适的迭代策略,并有效地管理状态。虽然递归算法在某些情况下提供简洁的表达,但非递归算法往往在效率和可读性上有优势,尤其是在处理大量数据或...
在本主题中,我们将深入探讨二叉树的三种主要遍历方法:中序遍历、前序遍历和后序遍历,以及如何通过递归和非递归的方式实现这些遍历。 首先,让我们理解递归遍历的概念。递归是一种解决问题的方法,它将问题分解为...
二叉树遍历是计算机科学中处理二叉树数据结构的一种基本操作,它涉及到访问二叉树中的每个节点。在二叉树中,每个节点最多有两个子节点...理解并熟练掌握递归和非递归遍历方法对任何IT专业人员来说都是非常重要的技能。
如果A可以通过一系列规则最终推导出自己,即使中间隔着其他非终结符,我们也称A为间接左递归。 二、为何需要消除左递归 1. 解析效率:左递归会导致解析器在处理输入时陷入无限循环,影响解析速度。 2. 自顶向下解析...
这个过程既可以用递归方式实现,也可以用非递归方式实现。 首先,让我们来看看递归版本的合并排序。递归算法的核心在于它的自相似性,即一个问题的解可以通过解决规模更小的相同问题得到。在合并排序中,我们首先将...
同时,递归图分析也适用于检测异常、检测信号变化点以及理解复杂系统的动态行为。 总之,熵的递归图分析是一种强大的工具,它结合了信息论、图论和信号处理的原理,为理解和处理一维信号提供了新的视角和方法。通过...
然而,递归也有其缺点,比如: - **空间效率**:由于每次递归调用都会增加堆栈空间,如果递归深度过大,可能会导致栈溢出。 - **可读性**:虽然递归代码简洁,但理解递归逻辑可能需要花费更多时间,特别是对于新手来...