Java递归基础

对于那些不知道递归是什么的人(并且像个笑声一样),请单击以下链接:Google搜索:递归,然后单击“您的意思是……”项。

希望您终于弄清楚了递归是指其自身的任何内容(如果不是,那么您可能会永远浏览Google并试图找出递归是什么!)。 递归的一个相当常见的例子是斐波那契数。 斐波纳契数的模式是将前两个项与下一个项相加,从一个和一个开始。

以下是斐波那契数的递归关系:

F(1)= F(2)= 1
F(n)= F(n-1)+ F(n-2)

递归关系是原始函数引用自身的任何关系。 那么我们如何找到F(5)?

F(5)= F(4)+ F(3)
F(5)= [F(3)+ F(2)] + [F(2)+ F(1)] F(5)= [F(2)+ F(1)] +1 +1 +1
F(5)= 1 + 1 + 1 + 1 + 1 F(5)= 5

似乎需要很多工作? 好吧,对于计算机来说,大多数时候都相当快。 稍后,我将向您介绍动态编程,因此当您要计算较大的斐波那契数时,我们可以加快速度。

那么递归函数的所有部分是什么? 首先,什么是递归函数? 递归函数是任何直接(间接或间接)调用自身的函数。 这是Java中的一个简单示例:

public static void doIt()
{doIt();
}

当然,这最终会导致堆栈溢出错误,因此不建议您尝试使用此代码。

所有有用的递归函数都具有以下一般属性:减少问题,直到计算机可以轻松解决为止。 为此,递归函数必须具有:

  1. 定义了基本案例(解决方案显而易见且无法进一步简化的案例)
  2. 减少步骤(简化给定问题的地方)
  3. 递归调用自身(基本上解决了更简单的情况)

在上面的Fibonacci递归函数中,您可以看到它一直在递归,直到只加1。 这是因为在斐波那契数列中1是基本情况,因此我们仅需将1加几次才能得到F(n)。

从理论上讲,所有递归函数都可以迭代编写,并且所有迭代函数都可以递归编写。 但是,在实践中,您会发现根据情况的不同,其中一种或两种理念会更好地发挥作用。

让我们递归地查看阶乘函数,并将其与它的迭代亲戚进行比较。

阶乘(N)= 1 * 2 * 3 * ... * N
基本上,将1到N的所有整数相乘即可得到N的阶乘。

迭代实现,您的代码将如下所示:

public static int iterativeFactorial(int n)
{int answer = 1;for (int i = 1; i < n; i++){answer *= i;}return answer;
}

我们还可以编写此函数的递归等效项:F(1)= 1 F(N)= F(N-1)* N您能看到这如何产生与迭代阶乘相同的结果吗? 这是递归计算阶乘的代码:

public static int recursiveFactorial(int n)
{if (n == 1){return 1;}else{return n * recursiveFactorial(n-1);}
}

那么,就性能而言,递归如何与此处的迭代解决方案相提并论? 可悲的是,答案很差。 此处的递归函数需要大量内存来存储方法堆栈并跟踪每个递归调用中的所有变量,而迭代解决方案仅需跟踪当前状态。 那么,为什么还要烦恼递归呢? 因为很多时候正确使用递归,其性能可能会超过迭代解决方案的性能,并且递归函数也可能更易于编写(有时)。

动态编程

动态编程是递归的一种形式,但是它是迭代实现的。 还记得我们上面的斐波那契计算机吗? F(5)= F(2)+ F(1)+ F(2)+ F(2)+ F(1)F(5)= 3 * F(2)+ 2 * F(1)我们有这里有一些“过度计算”。 只需计算一次F(2)和一次F(1)。 在这种情况下,计算这几个项并不需要太多的计算工作,但是在某些情况下,几乎不可能数百次重新计算解决方案。 因此,我们无需重新计算,而是将答案存储了下来。

public static int dynamicFibonacci(int n)
{int[] prevSolutions = new int[n];if (n == 1 || n == 2){return 1;}prevSolutions[0] = 1;prevSolutions[1] = 1;for (int i = 2; i < prevSolutions.length; i++){prevSolutions[i] = prevSolutions[i-1] + prevSolutions[i-2];}return prevSolutions[n-1];
}

因此,再次取F(5)。 如果我们以递归的方式进行操作,那么将有8次调用recursiveFibonacci。 但是,这里我们只计算一次F(1),F(2),F(3),F(4)和F(5)。 减少3个电话获得的收益似乎并不多,但是如果我们尝试计算F(50)怎么办? dynamicFibonacci仅会计算50个数字,但递归Fibonacci可能会超过1000个(当然,我还没有计算,所以我不知道它是否超过1000个)。

关于动态编程的最后一点是,它仅在有大量重叠的情况下才有用。 还记得recursiveFactorial函数吗? 如果我们调用recursiveFactorial(50)和dynamicFactorial(50),则它们将花费大致相同的时间,因为我们要进行相同数量的计算。 这是因为从来没有重叠。 这也是为什么排序算法不是通过动态编程实现的较差选择的原因:如果您分析大多数排序算法,则它们几乎没有重叠的解决方案,因此对于动态编程来说是一个较差的选择。

这是有关递归和动态编程的一些问题:

  1. 实现recursiveFactorial方法(您以为我忘了把它放在那里)
  2. 对于给定的递归关系,编写一个递归方法,将找到F(N)
  3. 这种递归关系在迭代方面意味着什么? 为此问题写一个迭代的解决方案。
  4. 这种递归关系是否适合动态编程? 为什么/为什么不呢?
  5. 有比迭代或递归解决方案更好的方法来解决此问题吗? 这是什么(如果有)? 提示:想想卡尔高斯

对于问题2-5,请使用以下递归关系:
F(1)= 1
F(N)= F(N-1)+ N

答案来了……

参考: Java编程论坛上 JCG合作伙伴的 递归

相关文章 :

  • Java Micro-Benchmarking:如何编写正确的基准
  • 首先记录异常的根本原因
  • 编程反模式
  • 您不想错过的十大Java书籍
  • Java日志混乱
  • 做短,但做对!

翻译自: https://www.javacodegeeks.com/2011/12/java-recursion-basics.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/373853.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

我是最棒的,我一定会成功!

有人曾经做过这样一个实验&#xff1a;他往一个玻璃杯里放进一只跳蚤&#xff0c;发现跳蚤立即轻易地跳了出来。再重复几遍&#xff0c;结果还是一样。根据测试&#xff0c;跳蚤跳的高度一般可达它身体的400倍左右&#xff0c;所以说跳蚤可以称得上是动物界的跳高冠军。     …

头部ct能检查出什么_【安全用药】做CT检查时应注意什么?

点击蓝字 关注我们安安徽徽&#xff0c;你知道做CT检查时应注意什么&#xff1f;上腹部CT检查前患者至少禁食6小时、检查前15分钟喝温开水充盈胃部、CT检查时&#xff0c;患者会受到一定量X射线辐射&#xff0c;应避免过度扫描......本期安全用药&#xff0c;大家一起来了解了解…

JAXB,SAX,DOM性能

这篇文章探讨了使用多种不同方法将XML文档编组为Java对象的性能。 XML文档非常简单。 它包含一个Person实体的集合。 <?xml version"1.0" encoding"UTF-8" standalone"yes"?> <persons><person><id>person0</id>…

虚拟机Linux图形界面配置NAT-桥接

点开“虚拟机->设置->桥接模式&#xff08;勾选复制物理网络连接状态&#xff09;->确认” 点击“右上角扇形网络图标->Edit Connections->Wired->选中->Delete->Add->IPv4 Settings->Method(Manual)->Add->输入IP&#xff0c;子网掩码&am…

年轻人应该谨记的十点

有个朋友的孩子今年大学毕业&#xff0c;托我帮他找个“好工作”&#xff0c;而且再三强调&#xff0c;这关系到孩子的前途命运&#xff0c;要我一定要全力以赴。他&#xff0c;一个非名牌大学的计算机网络专业应届毕业生&#xff0c;没有工作经验&#xff0c;他能找一个什么样…

python自动化构建工具_Python自动化构建工具scons使用入门笔记

这段时间用到了scons&#xff0c;这里总结下&#xff0c;也方便我以后查阅。一、安装sconsLinux环境(以CentOS为例)1、yum安装yum install scons2、源码安装下载scons&#xff1a;http://http://jaist.dl.sourceforge.net/project/scons/scons/2.3.0/scons-2.3.0.zip安装scons&…

Java 8状态更新

即将到来的Java SE 8发行版的两大新语言功能是Lambda Expressions和Modularity。 对于这两者&#xff0c;这些天的状态更新已经发布。 我会与您共享链接&#xff0c;因此您可能会在假期中通读它们 Oracle计划在2013年中期发布Java SE 8。 Lambda项目 Lambda项目以及JSR-335希望…

java 18 - 6 TreeMap嵌套使用

HashMap嵌套HashMap   动物     犬类         哈士奇   2         萨摩耶   1     猫类        波斯猫   2        加菲猫   3 先存储元素&#xff0c;然后遍历元素 1 package map_son;2 3 import java.util.HashMap;4 import…

程序设计语言

程序设计语言使用于书写计算机程序的语言。程序设计语言有3个方面的因素&#xff0c;即语法&#xff0c;语义和语用。语法标识程序的结构或形式。语义表示程序的含义。语用表示程序与使用者的关系。 程序设计语言的发展史 程序的复杂性度量 1&#xff0c;代码行度量法 出错率&a…

python集合类型是一种具体的数据类型_Python3基础语法之集合类型

set也是一种组合数据类型&#xff0c;支持成员关系操作(in)、对象大小计算操作符(len())&#xff0c;并且是iterable。集合数据类型至少提供一个set.isdisjoin()方法&#xff0c;支持比较&#xff0c;也支持为逻辑操作(在集合用于联合、交叉等上下文中使用)。只有可哈希运算的对…

Linux 安装之U盘引导

说到装系统最简单的方法无非就是找个系统安装光盘来然后就一步一步慢慢的安装。简单是简单但好似大多数人好像都木有Linux的安装光盘。因此只能用U盘来模拟光盘的功能来装系统咯。 电脑上装有Windows 7现要装Linux变双系统。 安装Linux前的准备&#xff1a; 1、电脑上分出空闲的…

OSGi:简介

为基于Java的系统创建的OSGi提供了模块化系统的框架。 OSGi使得可以定义每个单独模块与其他模块的依赖关系&#xff0c;并使用户可以控制生命周期并动态更改系统的每个组件。 OSGi是一个规范&#xff0c;最常见的实现可以算作Equinox &#xff0c; Apache Felix和Knoplerfish 。…

一起动手打造个人娱乐级linux

我们使用电脑&#xff0c;一直以来用的都是windows&#xff0c;但是对于像我这种爱折腾的人来说&#xff0c;尝试使用linux系统应该是一种不错的体验。说到linux&#xff0c;许多人可能都没听过&#xff0c;或者知道的人对它印象是这样的&#xff1a; 然而&#xff0c;linux发展…

PostgreSQL数据类型

http://blog.csdn.net/neo_liu0000/article/details/6254086 第六章 数据类型 6.1概述 PostgreSQL 提供了丰富的数据类型。用户可以使用 CREATE TYPE 命令在数据库中创建新的数据类型。PostgreSQL 的数据类型被分为四种&#xff0c;分别是基本数据类型、复合数据类型、域和伪类…

centos 卸载ffmpeg_CentOS Linux 操作系统安装 FFmpeg 教程

FFmpeg 是一个非常热门的开源项目&#xff0c;用来编解码音频视频流&#xff0c;被广泛用于各种流服务中。本教程在 CentOS 6、7、8 上面都可以使用&#xff0c;用来安装 FFmpeg 软件。一、安装前需求一个 sudo 账户&#xff0c;一般都是默认 root 账户即可。1、CentOS 8安装所…

Linux 火狐浏览器安装Flash插件

Linux系统安装完毕后&#xff0c;发现火狐浏览器视频播放不了而且总是提示安装Flash。而按火狐浏览器上的提示Flash插件安装总是失败&#xff0c;木有办法只能手动安装Flash插件啦。 到Flash官网&#xff1a;http://get.adobe.com/cn/flashplayer/ 下载系统对应的Flash插件&…

按汇总分组/多维数据集

时不时地&#xff0c;您会遇到一个使您达到SQL限制的要求。 我们中的许多人可能会提早放弃并使用Java / [或您的语言]计算内容。 相反&#xff0c;使用SQL可能是如此简单快捷。 如果您使用的是高级数据库&#xff0c;例如DB2 &#xff0c; Oracle &#xff0c; SQL Server &…

TCPUDP

TCP(传输控制协议) 建立连接&#xff0c;形成传输数据的通道在连接中进行大数据传输&#xff08;数据大小不受限制&#xff09;通过三次握手完成连接&#xff0c;是可靠协议&#xff0c;安全送达&#xff08;三次握手向服务器发送请求&#xff0c;响应请求回复&#xff0c;发送…

Windows和linux双系统——修改默认启动顺序

电脑上装了Windows 7和Ubantu双系统&#xff0c;由于Linux系统用的次数比较少并且还是默认的启动项对此很不能容忍&#xff0c;因此得修改Windows为默认的启动项。 由于电脑上的系统引导程序是GRUB&#xff0c;因此修改当然也就落到Linux系统上啦。 修改/boot/grub/grub.cfg该文…

ft232h引脚_usb转串口芯片 ft232的奇怪现象

硬件平台&#xff1a;stm32f407ft232RL按照手册上的电路&#xff0c;我用USB接口给ft232RL供电&#xff0c;如下图&#xff1a;0288f358ccd0026690b2443b41d98f0f_224.png (0 Bytes, 下载次数: 12)2010-12-14 22:54 上传我在这个电路的基础上我用单片机串口和芯片对应的TX和RX相…