java新人基础入门之递归调用

 更新时间:2021年02月21日 09:07:30   作者:一位远方的诗人  
这篇文章主要给大家介绍了关于java新人基础入门之递归调用的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

一、递归概念

递归本质:程序调用自身的编程技巧叫做递归。

程序调用自身的编程技巧称为递归( recursion)。递归做为一种算法在程序设计语言中广泛应用。 一个过程或函数在其定义或说明中有直接或间接调;

用自身的一种方法,它通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解,递归策略只需少量的程序就可描述出解题过;

程所需要的多次重复计算,大大地减少了程序的代码量。递归的能力在于用有限的语句来定义对象的无限集合。

二、递归的三个条件:

  • 边界条件
  • 递归前进段
  • 递归返回段

当边界条件不满足时,递归前进;当边界条件满足时,递归返回。

下面通过两个示例程序来说明:

使用Java代码求5的阶乘。(5的阶乘=5*4*3*2*1)

package org.wxp.recursion; 
 
/** 
 * 计算5的阶乘(result = 5*4*3*2*1) 
 * @author Champion.Wong 
 * 
 * 
 */ 
public class Test01 { 
 public static void main(String[] args) { 
  System.out.println(f(5)); 
 } 
  
 public static int f(int n) { 
  if (1 == n) 
   return 1; 
  else 
   return n*f(n-1); 
 } 
} 

此题中,按照递归的三个条件来分析:

(1)边界条件:阶乘,乘到最后一个数,即1的时候,返回1,程序执行到底;

(2)递归前进段:当前的参数不等于1的时候,继续调用自身;

(3)递归返回段:从最大的数开始乘,如果当前参数是5,那么就是5*4,即5*(5-1),即n*(n-1)

使用Java代码求数列:1,1,2,3,5,8......第40位的数

package org.wxp.recursion; 
 
/** 
 * 求数列:1,1,2,3,5,8......第40位的数 
 * @author Champion.Wong 
 * 
 */ 
public class Test_02_Fibonacci { 
 public static void main(String[] args) { 
  System.out.println(f(6)); 
 } 
  
 public static int f(int n ) { 
  if (1== n || 2 == n) 
   return 1; 
  else 
   return f(n-1) + f(n-2); 
 } 
} 

此题的突破口在:从第3位数开始,本位数是前两位数的和。要计算第多少位的值,那么就需要将位数作为参数传进方法进行计算。

(1)首先,当位数为1和2时,当前返回的值应该是1;

(2)然后,当位数为3时,返回值应该=2=1+1;

                 当位数为4时,返回值=3=2+1;

                 当位数为5时,返回值=5=3+2;

                 当位数为6时,返回值=8=5+3;

                 ......

(3)由(2)得知,大于等于3的情况下,当前位数(n)的数值=f(n-1)+f(n-2)

三、非递归方法实现(迭代方法)

迭代本质:利用变量的原值推算出变量的一个新值,迭代就是A不停的调用B.

通过观察推导,找到解决问题的方法,发现其中的规律,将其转化成程序语言表达出来。

本质:使用合适的数据类型变量代替问题中的数据,将解决问题的方法转化为符合程序语言的逻辑。

public class Fab{
 
   public static void main( String[] args){
 
  System.out.println(f(20));
}   
 
  public static long f(int index){
 
    if(index == 1 || index == 2){
       return 1;
    }
 
    long f1 = 1L;
    long f2 = 1L;
    long f = 0;
 
    for(int i=0; i<index; i++){
       f = f1 + f2;
       f1 = f2;
       f2 = f;
    }
    return f;
  }
 
}

递归其实是方便了程序员难为了机器,递归可以通过数学公式很方便的转换为程序。其优点就是易理解,容易编程。但递归是用栈机制实现的,每深入一层,都要占去一块栈数据区域,对嵌套层数深的一些算法,递归会力不从心,空间上会以内存崩溃而告终,而且递归也带来了大量的函数调用,这也有许多额外的时间开销。所以在深度大时,它的时空性就不好了。(会占用大量的内存空间)

而迭代虽然效率高,运行时间只因循环次数增加而增加,没什么额外开销,空间上也没有什么增加,但缺点就是不容易理解,编写复杂问题时困难。

能不用递归就不用递归,递归都可以用迭代来代替。(要辩证的看待这个问题,深度不大,还是可以采用递归的)。

总结

到此这篇关于java新人基础入门之递归调用的文章就介绍到这了,更多相关java递归调用内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Java创建数组、赋值的四种方式详解(声明+创建+初始化 )

    Java创建数组、赋值的四种方式详解(声明+创建+初始化 )

    数组是一种数据结构,用来存储同一类型值的集合一旦创建了数组,就不能再改变它的长度,下面这篇文章主要给大家介绍了关于Java创建数组、赋值的四种方式(声明+创建+初始化 )的相关资料,需要的朋友可以参考下
    2024-04-04
  • Spring Bean 依赖注入常见错误问题

    Spring Bean 依赖注入常见错误问题

    这篇文章主要介绍了Spring Bean 依赖注入常见错误问题,文中提到value的工作大体分为三个核心步骤,具体内容详情跟随小编一起看看吧
    2021-09-09
  • SpringBoot实现文件的上传、下载和预览功能

    SpringBoot实现文件的上传、下载和预览功能

    在Spring Boot项目中实现文件的上传、下载和预览功能,可以通过使用Spring MVC的MultipartFile接口来处理文件上传,并使用HttpServletResponse或Resource来实现文件下载和预览,下面是如何实现这些功能的完整示例,需要的朋友可以参考下
    2024-08-08
  • Java中的Callable实现多线程详解

    Java中的Callable实现多线程详解

    这篇文章主要介绍了Java中的Callable实现多线程详解,接口Callable中有一个call方法,其返回值类型为V,这是一个泛型,值得关注的是这个call方法有返回值,这意味着线程执行完毕后可以将处理结果返回,需要的朋友可以参考下
    2023-08-08
  • 详解Java利用ExecutorService实现同步执行大量线程

    详解Java利用ExecutorService实现同步执行大量线程

    这篇文章主要介绍了Java利用ExecutorService实现同步执行大量线程,ExecutorService可以维护我们的大量线程在操作临界资源时的稳定性。
    2017-03-03
  • Java Swing实现的定制TextField功能示例

    Java Swing实现的定制TextField功能示例

    这篇文章主要介绍了Java Swing实现的定制TextField功能,结合实例形式分析了java swing组件TextField相关属性功能与设置操作技巧,需要的朋友可以参考下
    2018-01-01
  • 探讨:如何在NDK中呼叫Java的class

    探讨:如何在NDK中呼叫Java的class

    本篇文章是对如何在NDK中呼叫Java的class进行了详细的分析介绍,需要的朋友参考下
    2013-05-05
  • Java实现微信公众平台朋友圈分享功能详细代码

    Java实现微信公众平台朋友圈分享功能详细代码

    这篇文章主要介绍了Java实现微信公众平台朋友圈分享功能详细代码,小编觉得挺不错的,这里分享给大家,供需要的朋友参考。
    2017-11-11
  • Java之Spring注解配置bean实例代码解析

    Java之Spring注解配置bean实例代码解析

    这篇文章主要介绍了Java之Spring注解配置bean实例代码解析,具有一定参考价值,文中还有有关Spring学习的资料下载链接及相关内容推荐,需要的朋友可以了解下。
    2017-09-09
  • java页面中文乱码的解决办法

    java页面中文乱码的解决办法

    做java开发的朋友碰到最多的就是中文乱码这个问题了,下面介绍页面提交时与url中文乱码的一些解决办法
    2013-11-11

最新评论