热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

耿老师带你深入Java学习:掌握递归与迭代的精髓

耿老师寄语本文通过大家熟悉的Fibonacci序列 ,描述用“迭代法”求解Fibonacci序列更容易被理解,而用“递归”求解(不同于通常教材的递归算法,但效率更高)更难理解php递归算法。 神理解递

耿老师寄语

本文通过大家熟悉的Fibonacci序列 ,描述用“迭代法”求解Fibonacci序列更容易被理解,而用“递归”求解(不同于通常教材的递归算法,但效率更高)更难理解php递归算法

神理解递归php递归算法,人理解迭代

耿祥义

本文通过大家熟悉的Fibonacci序列(前两项都是1php递归算法,以后每项是前两项的和)

1 1 2 3 5 8 13 21 34 55 89... ...

来描述用“迭代法”求解Fibonacci序列更容易被理解,而用“递归”求解(不同于通常教材的递归算法,但效率更高)更难理解php递归算法

1.递归和迭代的特点

"神理解递归,人理解迭代"这句话的出处已经无法查证,但本人非常赞同这句话php递归算法。递归是分治算法的最佳体现,即将规模大的算法问题分解成规模小的算法问题,最终解决规模大的算法问题。

●递归算法有两个主要特点:

(1)算法简洁

代码量很小,逻辑理解相对容易,但对于某些递归,理解算法的内部细是有相当难度的,这就是"神理解递归,人理解迭代"这句话的原因php递归算法

(2)栈溢出(StackOverflow)

递归需要进行函数的压栈和弹栈操作,如果递归深度较大就会占用大量的栈上空间,而且压栈和弹栈都会增加算法的用时php递归算法。因此,递归算法的一个主要问题就是,当递归深度较大过大时,可能会出现栈溢出 (StackOverflow)。对于线性递归,即函数每次只递归 调用本函数一次,时间和空间复杂度都是线性级别O(n),其中n是递归深度。对于非线性递归,即函数每次递归调用本函数多于一次,时间复杂度一定是指数级别O(2^n)(2的n次幂)(空间复杂度是 线性级别O(n)),其效率会随着递归级别的增大而迅速地降低。

● 迭代算法特点

不需要进行函数的不断压栈和弹栈操作,只需保留当前计算的结果,然后计算出下一次的结果后,立刻释放当前结果php递归算法。时间复杂度和空间复杂度依赖所使用的具体算法。迭代算法通常比较凌乱,逻辑上不够简洁。

2.fibonacci序列

● 非线性递归(求Fibonacci序列第n项)

传统递归,大学教材均采用,逻辑上好理解,算法简洁,细节也相对好理解php递归算法

展开全文

代码如下:

● 线性递归(求Fibonacci序列第n项)

非传统递归,本人未见大学教材采用,可在某些算法著作中见到线性递归求Fibonacci序列第n项php递归算法。算法简洁,但逻辑和细节-“神理解”。

代码如下:

● 迭代法(求Fibonacci序列第n项)

许多大学教材采用,算法不简洁,但有利去理解线性递归php递归算法

代码如下:

耿老师教你学Java:神理解递归,人理解迭代

MainClass.java

Fibonacci.java

耿祥义主要教材源代码暨习题解答下载


推荐阅读
  • 本章深入探讨了Java中的多态特性,这是面向对象编程的核心概念之一。多态指的是同一操作作用于不同的对象时,可以有不同的解释和执行方式。在Java中,多态通过父类引用变量引用子类对象来实现,即 `父类类型 引用变量名 = new 子类类型();`。这种方式允许程序在运行时根据实际对象的类型动态地选择合适的方法执行,从而提高代码的灵活性和可扩展性。此外,本章还详细介绍了多态的应用场景和注意事项,帮助读者更好地理解和运用这一重要概念。 ... [详细]
  • Java进阶之旅:第六阶段深度解析与实践
    在之前的Java进阶之旅中,我们已经深入探讨了Java语言的核心特性,包括继承、封装和多态。本文将在此基础上,进一步解析第六阶段的关键概念和技术实践,帮助读者深化对Java高级特性的理解和应用。通过具体的代码示例和实际项目中的应用场景,我们将探讨如何高效地利用这些特性解决复杂问题,提升开发效率和代码质量。 ... [详细]
  • 阿里巴巴Java后端开发面试:TCP、Netty、HashMap、并发锁与红黑树深度解析 ... [详细]
  • CSS3 实现鼠标悬停时滚动菜单的流畅过渡效果 ... [详细]
  • 博弈总结有一种很有意思的游戏,就是有物体若干堆,可以是火柴棍或是围棋子等等均可。两个人轮流从堆中取物体若干,规定最后取光物体者取胜。这是我 ... [详细]
  • 深入解析 org.hibernate.event.spi.EventSource.getFactory() 方法及其应用实例 ... [详细]
  • LeetCode 算法挑战:最小栈的 Java 实现与优化 ... [详细]
  • 下面的代码旨在输出其类文件的完整名称。对于不熟悉类字面量的读者,`Me.class.getName()` 方法会返回类的全称,例如 “com.javapuzzlers.Me”。通过这一机制,可以深入了解 Java 类加载和反射机制的内部工作原理。 ... [详细]
  • 内网渗透技术详解:PTH、PTT与PTK在域控环境中的应用及猫盘内网穿透配置
    本文深入探讨了内网渗透技术,特别是PTH、PTT与PTK在域控环境中的应用,并详细介绍了猫盘内网穿透的配置方法。通过这些技术,安全研究人员可以更有效地进行内网渗透测试,解决常见的渗透测试难题。此外,文章还提供了实用的配置示例和操作步骤,帮助读者更好地理解和应用这些技术。 ... [详细]
  • 教程:使用Source Monitor进行代码质量分析
    Source Monitor 是一款强大的代码分析工具,能够对 Java、C++、C、C# 和 Delphi 等多种编程语言进行复杂度分析,帮助开发者有效评估和提升代码质量。通过详细的指标和报告,该工具可辅助团队识别潜在问题并优化代码结构。 ... [详细]
  • 决策树在鸢尾花数据集上对不同特征组合的分类效果分析及模型性能比较
    本文探讨了决策树算法在鸢尾花数据集上的应用,分析了不同特征组合对分类效果的影响,并对模型性能进行了详细比较。决策树作为一种层次化的分类方法,通过递归地划分特征空间,形成树状结构,每个节点代表一个特征判断,最终达到分类目的。研究结果表明,不同特征组合对模型性能有显著影响,为实际应用提供了重要参考。 ... [详细]
  • PAT甲级 1068 寻找更多硬币 (30分) 01背包问题与路径优化
    PAT甲级 1068 寻找更多硬币 (30分) 01背包问题与路径优化 ... [详细]
  • 通过一张截图深入解析字节跳动的 Java 开发实力
    在与一位来自字节跳动的朋友交流时了解到,根据他们近期招聘Java工程师的经验,大多数候选人往往在工作3年后会遇到一个难以跨越的瓶颈期。这是因为在职业生涯的这个阶段,许多工程师的技术深度和广度已经达到了一定的水平,但要进一步提升则需要更多的挑战和学习机会。字节跳动作为一家技术驱动的公司,通过严格的面试流程和实际项目经验,能够更好地评估候选人的技术水平和发展潜力。 ... [详细]
  • 学术论文深度解析与评价
    本文深入探讨了基于摆线推进器的无人监测船系统的研发背景及其重要性。从环境保护的宏观视角出发,逐步聚焦至湖泊生态监测的具体需求,分析了现有生态监测技术的局限性,并提出了创新性的解决方案,旨在通过改进内部技术实现更高效、精准的生态环境监测。 ... [详细]
  • 网站前端开发的核心理念与必备技能解析 ... [详细]
author-avatar
zpcbb80569
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有