Java方法递归调用实例解析

这篇文章主要介绍了Java方法递归调用实例解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

/*
关于方法的递归调用
  1、什么是递归?
   -方法自身调用自身
   a(){
     a(){

     }
   }
  2、递归是很耗费栈内存的,递归算法可以不用的时候尽量不用
  3、一下程序运行的时候发生了这样一个错误【不是异常,是错误Error】:
   java.lang.StackOverflowErroe
   栈内存溢出错误。
   错误放生无法挽回,只有一个结果,就是JVM停止工作
  4、递归必须有结束条件,没有结束条件一定会发生栈内存溢出错误
  5、递归即使有了结束条件,即使结束条件是正确的,也可能会发生栈内存溢出错误,
   因为递归的太深了,栈内存被占满。
  注意:
   递归如果可以不使用,尽量不使用。
   但是有些情况下,该功能的实现必须一览递归实现,比如 目录拷贝

*/
public class Method01{
  // 主方法
  public static void main(String[] args){
   doSome();
  }
  // 调用doSome方法
  // 以下的代码片段虽然只有一份
  // 但是可以被重复的调用,并且只要调用doSome方法就会在栈内存中开辟一块所属的内存空间,
  public static void doSome(){
   System.out.println("doSome begin!");
   doSome();//这行代码不结束,下一行代码是不能执行的
   System.out.println("doSome over!");
  }
}
/*
不使用递归计算1-N的求和【可以不用递归,尽量不用递归】

*/
public class Method01{
  // 主方法
  public static void main(String[] args){
   // 计算1-4的和
   // int n = 4;
   // int sum = 0;
   // for(int i=1;i<=n;i++){
   //  sum += i;
   // }
   // System.out.println(sum);

   // 直接调用方法即可
   int n = 4;
   int resultVal=sum(n);
   System.out.println(resultVal);
  }
  // 单独定义一个方法,这是一个独立的功能,可以完成1-N的求和
  public static int sum(int n){
   int result = 0;
   for(int i=1;i<=n;i++){
     result+=i;
   }
   return result;
  }

}
/*
使用递归计算1-N的和

*/
public class Method01{
  // 主方法
  public static void main(String[] args){
   // 1-4的和
   int n = 4;
   int retValue = sum(n);
   System.out.println(retValue);
  }
  public static int sum(int n){
   // 4+3+2+1
   if(n == 1){
     return 1;
   }
   return n + sum(n-1);
  }

}

/*
先不使用递归计算N的阶乘
5的阶乘:
  5*4*3*2*1

*/
public class Method01{
  // 主方法
  public static void main(String[] args){
   int n = 5;
   int retValue = method(n);
   System.out.println(retValue);//120
  }
  public static int method(int n){
   int result = 1;
   for(int i=n;i>0;i--){
     result *= i;
   }
   return result;
  }

}
/*
使用递归计算N的阶乘
5的阶乘:
  5*4*3*2*1

*/
public class Method01{
  // 主方法
  public static void main(String[] args){
   int n = 5;
   int retValue = method(n);
   System.out.println(retValue);//120
  }
  public static int method(int n){
   if(n==1){
     return 1;
   }
   return n*=method(n-=1);
  }

}

递归内存分析:

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • java如何写接口给别人调用的示例代码

    计算机语言分类有很多,如C.C++.C#.Java.Php.Python等等,她们有各自的特性及擅长的领域,但她们各自又不是全能的.在一个稍微大型一点的项目都会用到多种语言共同完成,那么这些编程语言如何进行通信呢.什么意思呢,就是比如说我Java写的一个方法,其他编程语言要怎么去调用呢?这就是本文要探讨的问题了. 一般来说,方法层面的编程语言通信用的是网络接口形式,只暴露出形参和结果供别人调用.接口一般分为接口定义者和接口调用者,定义者可以规定接收参数的类型及返回形式,而接口定义者则只能完全按照

  • JAVA发送http get/post请求,调用http接口、方法详解

    三个例子 -JAVA发送http get/post请求,调用http接口.方法 例1:使用 HttpClient (commons-httpclient-3.0.jar jar下载地址:http://xiazai.jb51.net/201904/yuanma/commons-httpclient-3.0.rar import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.IOE

  • Java远程调用Shell脚本并获取输出信息【推荐】

    1.添加依赖 <dependency> <groupId>ch.ethz.ganymed</groupId> <artifactId>ganymed-ssh2</artifactId> <version>262</version> </dependency> <dependency> <groupId>commons-io</groupId> <artifactId&g

  • Java调用Redis集群代码及问题解决

    前言 需要使用以下jar包 Maven项目引用以下配置: <dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-pool2</artifactId> <version>2.6.2</version> </dependency> <dependency> <groupId>redis.clients&l

  • Java自定义函数调用方法解析

    这篇文章主要介绍了java自定义函数调用方法解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 一:主类中自定义函数 在主类中,如果想要在main函数中调用自定义的其他方法,则这个函数需要使用static关键字定义,否则会报错Cannot make a static reference to the non-static method xx from the type xx,调用的时候直接用函数名就可以了,如下: public class cr

  • Vue调用后端java接口的实例代码

    前段时间 做了个学校的春萌项目,其中用到vue连接后端java接口. 先上后端接口代码: package controller; import net.sf.json.JSONObject; import util.DBUtil; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax

  • Java接口异步调用

    前言 java接口调用从调用方式上可以分为3类:同步调用,异步调用,回调:同步调用基本不用说了,它是一种阻塞式的调用,就是A方法中直接调用方法B,从上往下依次执行.今天来说说异步调用. 什么是异步调用? 我的理解就是在方法A中调用方法B,但是方法B很耗时,如果是同步调用的话会等方法B执行完成后才往下执行,如果异步的话就是我调用了方法B,它给我个返回值证明它已接受调用,但是它并没有完成任务,而我就继续往下执行.可能有表达不当的地方,欢迎指正. 再用一个生活中的例子吧: 异步调用就是你 喊 你朋友吃

  • Java调用第三方接口示范的实现

    在项目开发中经常会遇到调用第三方接口的情况,比如说调用第三方的天气预报接口. 使用流程 [1]准备工作:在项目的工具包下导入HttpClientUtil这个工具类,或者也可以使用Spring框架的restTemplate来调用,上面有调用接口的方法[分为Get和Post方式的有参和无参调用]: package com.njsc.credit.util; import java.io.IOException; import java.net.URI; import java.util.ArrayL

  • java子类调用父类的方法中包含子类重写的实例方法

    # 看题目是不是很绕,这个我也不知道怎么才能更简单的表达了 # 先看代码: public class Common { public static void main(String[] args) { Sub sub = new Sub(); sub.testSub(); } } class Parent { protected boolean test() { throw new RuntimeException(); } protected void testParent() { if (t

  • Java方法递归调用实例解析

    这篇文章主要介绍了Java方法递归调用实例解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 /* 关于方法的递归调用 1.什么是递归? -方法自身调用自身 a(){ a(){ } } 2.递归是很耗费栈内存的,递归算法可以不用的时候尽量不用 3.一下程序运行的时候发生了这样一个错误[不是异常,是错误Error]: java.lang.StackOverflowErroe 栈内存溢出错误. 错误放生无法挽回,只有一个结果,就是JVM停止工作 4

  • Java方法引用原理实例解析

    目录 冗余的Lambda场景 问题分析 用方法引用改进代码 方法引用符 通过对象名引用成员方法 通过类名称引用静态方法 通过super引用成员方法 通过this引用成员方法 类的构造器引用 数组的构造器引用 总结 在使用Lambda表达式的时候,我们实际上传递进去的代码就是一种解决方案:拿什么参数做什么操作.那么考虑 一种情况:如果我们在Lambda中所指定的操作方案,已经有地方存在相同方案,那是否还有必要再写重复逻辑? 冗余的Lambda场景 在 Printable 接口当中唯一的抽象方法 p

  • 简单解析java方法在调用在内存中的执行过程

    目录 一.前提 1.栈的内存原理图 2.JVM是怎么运行方法的??? 二.调用(执行)过程 1.方法调用时的规则 2.示例代码 3.整个程序的方法调用的过程图 4.示例代码运行截图 一.前提 1.栈的内存原理图 2.JVM是怎么运行方法的??? 1.在运行阶段的时候,classLoader类加载器会把class文件中方法对应的代码片段放入内存区中的方法区中,以便于下次调用方法时,还能使用该方法. 2.JVM在运行过程中,会把方法里面的代码块按照方法调用的先后顺序压栈入内存中的栈空间,按照方法里语

  • java线程的基础实例解析

    java中建立线程可以有两种方式,分别是继承Thread类和实现Runnable接口. 继承Thread public class MyThread extends Thread{ public MyThread(String name){ super(name); } int i; public void run(){ for(i=0;i<5;i++){ System.out.println(getName()+"--"+i); } } public static void m

  • Java中后台线程实例解析

    本文研究的主要是Java中后台线程的相关问题,具体介绍如下. 以前从来没有听说过,java中有后台线程这种东西.一般来说,JVM(JAVA虚拟机)中一般会包括俩种线程,分别是用户线程和后台线程.所谓后台线程(daemon)线程指的是:在程序运行的时候在后台提供的一种通用的服务的线程,并且这种线程并不属于程序中不可或缺的部分.因此,当所有的非后台线程结束的时候,也就是用户线程都结束的时候,程序也就终止了.同时,会杀死进程中的所有的后台线程.反过来说,只要有任何非后台线程还在运行,程序就不会结束.不

  • Java方法参数传递机制原理解析

    这篇文章主要介绍了Java方法参数传递机制原理解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 Java方法中如果声明了形参,在调用方法时就必须给这些形参指定参数值,实际传进去的这个值就叫做实参. 这就涉及到Java中的参数传递机制,值传递. 基本数据类型 基本数据类型,值传递的体现是数值的传递. public class TransferTempTest { public static void main(String[] args) {

  • java编程多线程并发处理实例解析

    本文主要是通过一个银行用户取钱的实例,演示java编程多线程并发处理场景,具体如下. 从一个例子入手:实现一个银行账户取钱场景的实例代码. 第一个类:Account.java 账户类: package cn.edu.byr.test; public class Account { private String accountNo; private double balance; public Account(){ } public Account(String accountNo,double

  • java泛型常用通配符实例解析

    这篇文章主要介绍了java泛型常用通配符实例解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 今天在看ArrayList原码是看到这样的一个符号,好奇怪. ?表示通配符,表示的意思是匹配E或E的子类,具体类型未知. 1.限定通配符 编写一个类似于ArrayList的动态数据 public class Gys<T> { private final static int default_capacity =10; private int end

  • Java线程池ForkJoinPool实例解析

    这篇文章主要介绍了Java线程池ForkJoinPool实例解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 背景:ForkJoinPool的优势在于,可以充分利用多cpu,多核cpu的优势,把一个任务拆分成多个"小任务",把多个"小任务"放到多个处理器核心上并行执行:当多个"小任务"执行完成之后,再将这些执行结果合并起来即可.这种思想值得学习. import java.io.IOExcept

  • java常用数据流应用实例解析

    这篇文章主要介绍了java常用数据流应用实例解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 按操作单位的不同分为:字节流(8bit)(InputStream.OuputStream).字符流(16bit)(Reader.Writer) 按数据流的流向不同分为:输入流.输出流 按角色的不同分为:节点流.处理流 一.不带缓冲的流 1.文件字节输入流.文件字节输出流 package anno; import java.io.File; impor

随机推荐