百家号Lite
如何看待百家号小程序热议话题「在Java中,递归是一个非常有用的技术,不信你来看看」
递归是大家之前可能遇到的一个概念。当函数调用自身,或调用另外一个函数,但这个函数的调用树中的某个地方又调用了自己时,递归就发生了。对任何类型的程序来说,递归都是一个非常有用的技术。大家可能会想,递归在有大量数学计算的程序里是最有用的,确实如此--很多数学公式在本质上都是递归。而且,对树进行遍历的时候,递归也是非常有用的,这是一个可能会在Web程序中出现的构造。我们还可以使用递归深入理解函数在JavaScript中是如何工作的。让我们先从最简单的递归开始。一、普通命名函数中的递归有很多常见的递归函数示例。其中一个是用于检测回文的--相当于递归技术的"Helloworld!"。回文的非递归定义是"一个短语,不管从哪个方向读都是相同的",我们可以用它来实现一个函数,用于创建反向字符串并和字符串本身进行比较。但是复制字符串从多方面来说不是简洁的解决方案,其中一个原因就是需要分配并创建新字符串。通过利用回文的更多数学定义,我们可以想出一个更简洁的解决方案。这些定义如下所示。1.单个和零个字符都是一个回文。2.如果字符串的第一个字符和最后一个字符相同,并且除了两个字符以外剩余的其他字符也是一个回文的话,我们称原字符串是一个回文。基于该定义的代码实现如下:注意,上述新定义及其实现都是递归的,因为它使用回文的定义来确定一个字符串是否是回文。实现很简单,我们在函数的最后一行递归调用函数自身。思考:上述函数并没有处理text参数值是null或者undefined的情形。该如何解决这个问题呢?事实上,在这种情况下会返回什么内容呢?不存在的回文字符串?当我们使用匿名函数处理回文时,事情会变得更有趣儿,并且有点不太清晰了,我们将在稍后对此进行讨论。让我们创建一个简单的递归示例。忍者(ninjas)之间也经常需要沟通,通常用自然声作为掩护。在这里,我们给忍者赋予发出"啾啾"声的能力,利用不同数量的啾啾声编码不同的消息。首先,我们先以使用函数名称进行递归的实现开始,代码如下所示:代码清单2(下图)使用命名函数发出"啾啾"声在上述代码中,我们声明了一个名为chirp()的函数,该函数通过调用自身函数名进行递归,就像回文的例子一样。然后,下面测试用于验证函数是否按预期方式工作。关于递归代码清单2中的函数递归的两个条件:引用自身,并且有终止条件。很显然函数调用了自身,所以满足了第一个条件。由于每次迭代参数n的值都会减少,它迟早会达到递归终止的条件,所以也满足了第二个条件。请注意,"递归"函数不能终止于无限循环!递归在命名函数中的运行已经很清楚了,但是,在匿名函数中是如何运行的呢?二、方法中的递归在前面的小节中,我们说要给忍者发出"啾啾"声的能力,但是我们却并没有这样做。我们创建的只是一个鸣叫的独立函数。让我们通过声明一个递归函数并将其作为ninja对象的方法来完成这个任务。这使得事情变得有点儿复杂,因为会将递归函数变成一个匿名函数赋值给对象的一个属性,代码示例如下:代码清单3(上图)对象中的方法递归在上述测试中,我们将递归函数定义成一个匿名函数,并将其引用到ninja对象的chirp属性。在该函数内,我们通过对象的ninja.chirp()属性递归调用了函数自身。我们不能像代码清单2中一样直接使用函数的名称进行调用,因为它根本就没有名称。图2展示了上述代码之间的关系。图2此时的函数,现在是一个方法,它通过对象的chirp属性引用自身这就是代码关系,但因为我们在函数上使用了非直接(indirect)引用--也就是ninja对象的chirp属性--所以才能进行递归。这并不是忍者的明智之举。让我们看看为什么会有问题。三、引用的丢失问题代码清单4.3中的示例依赖于:一个进行递归调用的对象属性引用。与函数的实际名称不同,这种引用可能是暂时的,这种依赖方式会导致我们很混乱。让我们修改一下前面的示例,添加一个新对象,比如说samurai,该对象也引用ninja对象上的匿名递归函数。代码示例如下。代码清单4(下图)递归中的函数引用丢失我们可以看一下,在该场景中如何进行快速分解。我们给samurai对象复制了原有函数的引用,所以现在ninja.chirp和samurai.chirp都引用了同样的匿名函数。图3展示了该关系图。A部分(从图2中可以了解到)显示了ninja对象创建后的结构,而B部分显示了samurai对象创建后的结构。以上就是匿名函数的递归程序,小行家已经把这些教程以及教程图片都整理出来了,大家学习的怎么样呢?喜欢的就快关注我吧。
该话题由百家号作者Java编程小行家「简介:Java编程小行家,教你轻松编写Java程序」整理发布。
更多有关在Java中,递归是一个非常有用的技术,不信你来看看的讨论请扫码关注百家号小程序签约作者「Java编程小行家」了解更多
方法1:微信扫描百家号Lite小程序码即可订阅热议话题「在Java中,递归是一个非常有用的技术,不信你来看看」
方法2:微信搜索百家号Lite小程序名称进入,即可订阅热议话题「在Java中,递归是一个非常有用的技术,不信你来看看」
方法3:微信网页访问即速商店,长按识别百家号Lite小程序码即可订阅热议话题「在Java中,递归是一个非常有用的技术,不信你来看看」
百家号Lite小程序热议话题「在Java中,递归是一个非常有用的技术,不信你来看看」由百家号Lite原创摘录于微信小程序商店shop.jisuapp.cn,转载请注明出处。
百家号Lite热议话题「在Java中,递归是一个非常有用的技术,不信你来看看」由百家号Lite开发者向微信用户提供,并对本服务内容、数据资料及其运营行为等真实性、合法性及有效性承担全部责任。