java递归基础掉用_Java递归基础

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

java递归基础掉用

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

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

相关文章

圣诞节,程序员应该给女朋友送一个线上圣诞树

前言:圣诞节虽然不是中国的传统节日,但当下很多时髦的年轻人却很喜欢过这个欢乐的节日,并乐于打造参与属于这个节日的仪式感。 除了所知的圣诞老人、圣诞树、互送礼物、吃大餐等传统习俗外,其实程序员能为今天的节日增加一些特别的环节。 圣诞树下载:https://download.csd…

maven 按业务拆分模块_Maven模块拆分方法

一个大项目经常要拆分成多个小模块分开打包&#xff0c;Maven是可以支持模块拆分的。可以包含(父模块即项目包含子模块)&#xff0c;也可以并行(父模块和子模块是平级的)。推荐用包含方式&#xff0c;更清晰&#xff0c;更简单一些。首先建个空项目&#xff0c;只要个pom.xml&a…

用户注册,报修

一、需求分析 &#xff08;1&#xff09;还没有注册的客户&#xff0c;可以进入注册界面进行注册。 &#xff08;2&#xff09;新建一个报修表&#xff0c;名字为repair_info0&#xff0c;列有用户名、报修类型、报修地点、报修内容&#xff0c;报修日期和时间、用户报修次数。…

Java SE 8新功能介绍:使用Streams API处理集合

使用Java SE 8 Streams的代码更干净&#xff0c;易读且功能强大..... 在“ Java SE 8新功能介绍”系列的这篇文章中&#xff0c;我们将深入解释和探索代码&#xff0c;以了解如何使用流遍历集合&#xff0c;从集合和数组创建流&#xff0c;聚合流值。 在上一篇文章“ Lambda的…

在HTML中使用css3实现雪人动画效果

背景:圣诞节又到了,拿什么来哄女朋友开心? 项目结构: html: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xht…

mysql 释放内存_mysql查询后释放内存

我正在使用CodeIgniter从远程服务器导入大表.我一次将查询分成1000行.这将是一个在后台运行的cron脚本.$userDB是本地数据库对象,而$remoteDB是远程数据库对象private function fetch_remote_db_table($remoteDB, $remoteTable, $localTable FALSE){$success FALSE;$returnOb…

linux线程池简单实例

linux线程池简单实例转载于:https://www.cnblogs.com/adong7639/p/5044685.html

圣诞节又到了,作为程序猿的我用代码给女朋友送了一个礼物

圣诞节又到了&#xff0c;拿什么来哄女朋友开心&#xff1f;我们先来做一个简单的雪人动画&#xff1a;项目结构&#xff1a;html:<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.d…

【Linux】权限篇(二)

权限目录 1. 前言2. 权限2.1 修改权限2.2 有无权限的对比2.3 另外一个修改权限的方法2.3.1 更改用户角色2.3.2 修改文件权限属性 3. 第一个属性列4. 目录权限5. 默认权限 1. 前言 在之前的一篇博客中分享了关于权限的一些知识&#xff0c;这次紧接上次的进行&#xff0c;有需要…

mysql 替代like_mysql用instr替代like查询

使用内部函数INSTR&#xff0c;代替传统的LIKE方式查询&#xff0c;不仅速度更快&#xff0c;而且省去了通配符检查&#xff0c;因此更加安全。INSTR()函数返回字符串中子字符串第一次出现的位置。如果在str中找不到子字符串&#xff0c;则INSTR()函数返回零(0)。下面说明了INS…

项目实战:小米商城官网及秒杀高仿(html+css+js)

导读:秒杀的检索结果,小米官方网站包含秒杀价格及秒杀适配机型,官方推荐秒杀产品,帮助米粉挑选合适自己的秒杀商品。 仿小米手机商城的全套页面。包含首页,订单页,列表页,商品详情页,个人中心,购物车,等等几十个页面。 有轮播的实现,demo 基于html css 实现小米官网部分内容搭…

Unity3d 配置OpenCV(EmguCV) 周围环境

最近毕业。我们一直在研究如何Unity正在使用EmguCV&#xff0c;最后&#xff0c;有些吃老本的今天。 我的环境&#xff1a;Unity3d 4.3.1f libemgucv-windows-universal-gpu-2.4.9.1847 原文參考&#xff1a;http://forum.unity3d.com/threads/182600-OpenCV-(EMGUC…

Java 8的方法参考进一步限制了重载

方法重载一直是一个充满喜忧参半的话题。 我们已经在博客上介绍了它&#xff0c;并介绍了几次警告&#xff1a; 您会后悔对Lambdas应用重载&#xff01; 保持干燥&#xff1a;方法重载 为什么每个人都讨厌操作员超载 API设计师&#xff0c;请小心 重载有用的主要原因有两个…

多态性(C#)

在面向对象编程中继承性和多态性是重要机制&#xff0c;前面我为大家分享了我对“类的继承”的理解&#xff0c;哪么今天我就跟大家分享下我对“多态性(C#)”的理解。 首先我们先来看看多态的定义&#xff0c;同一操作作用于不同的对象&#xff0c;可以有不同的解释&#xff0c…

孙叫兽重磅推荐Chrome插件——CSDN浏览器助手

导读:解决你在浏览器上遇到的各种问题,无论你是学生小白、还是职场老鸟,都可以借助这个插件,打造个性化浏览器,提升工作学习效率。 此插件经过多轮迭代,体积小,内存占用少,便于开发者快速安装和使用。 官方地址:https://plugin.csdn.net/ 目录 安装方法:

mysql concat 引号_在MySQL concat里面使用多个单引号,三引号的问题

在动态拼接字符串时&#xff0c;我们常会用到字符拼接&#xff0c;我对拼接的引号不理解&#xff0c;如&#xff1a;1、 id 为什么是3个引号&#xff0c;为什么左边一个加号右边一个加号(能不能着重帮我解释下这个&#xff0c;详细点)SQL codesum(case Leave when id then D…

【APICloud系列|21】使用APICloud敏捷式开发总结,回顾开发一个完整APP过程。

导读:APICloud是柚子(北京)科技有限公司创建的低代码开发平台,总部位于北京, 通过生产力工具与混合开发技术,为企业与开发者构建高效的IT环境;在APICloud平台已有80万注册用户,平台每日生成安装包超6000个。业务团队延伸至上海、深圳、重庆、青岛等10余个城市。 APICloud是…

mysql 存储过程 记录是否存在_如何检查MySQL中是否存在存储过程?

让我们首先创建一个存储过程-mysql> DELIMITER //mysql> CREATE PROCEDURE ExtenddatesWithMonthdemo(IN date1 datetime, IN NumberOfMonth int )-> BEGIN-> SELECT DATE_ADD(date1,INTERVAL NumberOfMonth MONTH) AS ExtendDate;-> END;-> //mysql> DEL…

[ExtJS5学习笔记]第三十五条 sencha extjs 5 组件查询方法

一UI前部组件势必更加&#xff0c;我们通常习惯性使用ID获取部件操作的需要。但是&#xff0c;这种方法是extjs推荐么&#xff1f;你有吗extjs利用它来获取组件的推荐方法&#xff1f; 夹 文件夹extjs的查询组件的API查询实例主要的组件查询组件树查询通过组件的属性检索属性匹…

数据湖 多维数据集_按汇总分组/多维数据集

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