J2SE--递归调用

2024-08-26 21:32
文章标签 调用 递归 j2se

本文主要是介绍J2SE--递归调用,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

        前段时间在复习J2SE时候看到了“递归”和“迭代”这部分知识,之前没有很好的梳理,这次补上总结。

        一、概念理解:

        (1) 递归

      “从前有座山,山里有座庙,庙里有个老和尚,正在给小和尚讲故事呢!故事是什么呢?“从前有座山,山里有座庙,庙里有个老和尚,正在给小和尚讲故事呢!故事是什么呢?……””。

         这个故事永远也讲不完,因为没有递归结束条件,如果递归没有结束条件,那么就会无限递归下去。

         其实递归很简单,形式上一个递归结束条件,一个自己调用自己的方法

 

        (2)迭代

          迭代是重复一组指令,不断第根据变量的旧值推出新值,最终得到所需的解。


        二、对比

       用一个求等差数列前N项和的例子:1+2+3+4……

       对于递归:

       sum(5)

      5+sum(4)

      5+4+sum(3)

      5+4+3+sum(2)

      5+4+3+2+sum(1)

      5+4+3+2+1+sum(0)

      5+4+3+2+1+0

      5+4+3+2+1

      5+4+3+3

      5+4+6

      5+10

      15

       可以观察到,递归调用是一个先扩展后收缩的过程,即先进行递推,之后进行回归,类似于我们在软考中所学到的“分治法”,大问题化小问题,小问题解决之后再综合求解大问题。

       如图--J2SE视频举例:一定是走到最深处之后,才进行返回。

                         

 

        然而对于迭代方法:           

         0+1=1

        1+2=3

        3+3=6

        6+4=10

        10+5=15

       用计算出的结果当做新值继续计算,得到最终结果,这个过程更像是一条直线,把后面的线段拿到前面,不断地前进,没有扩张和收缩的过程。

       从如上对比中,可以看到“递归”在执行过程中,会有一个扩充再收缩的过程,很容易让人联想到化学课上的“链式反应”,不易受控制,正如概念中所提到的,递归“一个终止条件、一个自身调用”, 一旦终止条件不对,扩张过程加大,容易导致“溢出”错误,而迭代则是直线式进行,在资源上不会出现这种情况。

       而之所以会出现溢出,使用递归时每调用一次,就需要在栈上开辟一块空间,而使用迭代时,不会这样,因为仅仅是重复调用某一个过程,所以相比之下,使用迭代更加安全。

      然而,在我们使用算法过程中,像之前学习过的回溯法、分治法,都用到了递归调用,在数据结构中,树的遍历,图的搜索,也都是递归,这当然另当别论,一般情况下,能使用迭代,就少用递归。



 

 

这篇关于J2SE--递归调用的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1109733

相关文章

如何在页面调用utility bar并传递参数至lwc组件

1.在app的utility item中添加lwc组件: 2.调用utility bar api的方式有两种: 方法一,通过lwc调用: import {LightningElement,api ,wire } from 'lwc';import { publish, MessageContext } from 'lightning/messageService';import Ca

【LabVIEW学习篇 - 21】:DLL与API的调用

文章目录 DLL与API调用DLLAPIDLL的调用 DLL与API调用 LabVIEW虽然已经足够强大,但不同的语言在不同领域都有着自己的优势,为了强强联合,LabVIEW提供了强大的外部程序接口能力,包括DLL、CIN(C语言接口)、ActiveX、.NET、MATLAB等等。通过DLL可以使用户很方便地调用C、C++、C#、VB等编程语言写的程序以及windows自带的大

string字符会调用new分配堆内存吗

gcc的string默认大小是32个字节,字符串小于等于15直接保存在栈上,超过之后才会使用new分配。

PHP实现二叉树遍历(非递归方式,栈模拟实现)

二叉树定义是这样的:一棵非空的二叉树由根结点及左、右子树这三个基本部分组成,根据节点的访问位置不同有三种遍历方式: ① NLR:前序遍历(PreorderTraversal亦称(先序遍历)) ——访问结点的操作发生在遍历其左右子树之前。 ② LNR:中序遍历(InorderTraversal) ——访问结点的操作发生在遍历其左右子树之中(间)。 ③ LRN:后序遍历(PostorderT

京东物流查询|开发者调用API接口实现

快递聚合查询的优势 1、高效整合多种快递信息。2、实时动态更新。3、自动化管理流程。 聚合国内外1500家快递公司的物流信息查询服务,使用API接口查询京东物流的便捷步骤,首先选择专业的数据平台的快递API接口:物流快递查询API接口-单号查询API - 探数数据 以下示例是参考的示例代码: import requestsurl = "http://api.tanshuapi.com/a

vue 父组件调用子组件的方法报错,“TypeError: Cannot read property ‘subDialogRef‘ of undefined“

vue 父组件调用子组件的方法报错,“TypeError: Cannot read property ‘subDialogRef’ of undefined” 最近用vue做的一个界面,引入了一个子组件,在父组件中调用子组件的方法时,报错提示: [Vue warn]: Error in v-on handler: “TypeError: Cannot read property ‘methods

oracle11.2g递归查询(树形结构查询)

转自: 一 二 简单语法介绍 一、树型表结构:节点ID 上级ID 节点名称二、公式: select 节点ID,节点名称,levelfrom 表connect by prior 节点ID=上级节点IDstart with 上级节点ID=节点值 oracle官网解说 开发人员:SQL 递归: 在 Oracle Database 11g 第 2 版中查询层次结构数据的快速

【微服务】Ribbon(负载均衡,服务调用)+ OpenFeign(服务发现,远程调用)【详解】

文章目录 1.Ribbon(负载均衡,服务调用)1.1问题引出1.2 Ribbon负载均衡1.3 RestTemplate整合Ribbon1.4 指定Ribbon负载均衡策略1.4.1 配置文件1.4.2 配置类1.4.3 定义Ribbon客户端配置1.4.4 自定义负载均衡策略 2.OpenFeign面向接口的服务调用(服务发现,远程调用)2.1 OpenFeign的使用2.1 .1创建

类和对象的定义和调用演示(C++)

我习惯把类的定义放在头文件中 Student.h #define _CRT_SECURE_NO_WARNINGS#include <string>using namespace std;class student{public:char m_name[25];int m_age;int m_score;char* get_name(){return m_name;}int set_name