专注Java教育14年 全国咨询/投诉热线:400-8080-105
动力节点LOGO图
始于2009,口口相传的Java黄埔军校
首页 学习攻略 Java学习 Java基础学习:java怎么递归函数

Java基础学习:java怎么递归函数

更新时间:2020-03-18 13:50:15 来源:动力节点 浏览2153次


  递归的思想


  以此类推是递归的基本思想。


  具体来讲就是把规模大的问题转化为规模小的相似的子问题来解决。在函数实现时,因为解决大问题的方法和解决小问题的方法往往是同一个方法,所以就产生了函数调用它自身的情况。另外这个解决问题的函数必须有明显的结束条件,这样就不会产生无限递归的情况了。


  递归的两个条件


  可以通过递归调用来缩小问题规模,且新问题与原问题有着相同的形式。(自身调用)


  存在一种简单情境,可以使递归在简单情境下退出。(递归出口)


  递归三要素:


  一定有一种可以退出程序的情况;


  总是在尝试将一个问题化简到更小的规模


  父问题与子问题不能有重叠的部分


  递归:自已(方法)调用自已


  例子:用递归把目录下所有的目录及文件全部显示出来

  publicclassB{

  publicstaticvoidmain(String[]args){

  Filefile=newFile("f:\\123");

  listAllFile(file);

  }

  publicstaticvoidlistAllFile(Filefile){

  File[]strs=file.listFiles();

  for(inti=0;i<strs.length;i++){

  //判断strs[i]是不是目录

  if(strs[i].isDirectory()){

  listAllFile(strs[i]);//递归调用自己

  System.out.println("目录="+strs[i].getName());

  }else{

  System.out.println("文件名="+strs[i].getName());

  }

  }

  }

  }

  递归算法的一般形式:

  func(mode){

  if(endCondition){//递归出口

  end;

  }else{

  func(mode_small)//调用本身,递归

  }

  }

  例子


  求一个数的阶乘是练习简单而典型的例子,阶乘的递推公式为:factorial(n)=n*factorial(n-1),其中n为非负整数,且0!=1,1!=1


  我们根据递推公式可以轻松的写出其递归函数:

  publicstaticlongfactorial(intn)throwsException{

  if(n<0)

  thrownewException("参数不能为负!");

  elseif(n==1||n==0)

  return1;

  else

  returnn*factorial(n-1);

  }

  递归的过程


  在求解6的阶乘时,递归过程如下所示。


Java基础学习:java怎么递归函数

  我们会惊奇的发现这个过程和栈的工作原理一致对,递归调用就是通过栈这种数据结构完成的。整个过程实际上就是一个栈的入栈和出栈问题。然而我们并不需要关心这个栈的实现,这个过程是由系统来完成的。


  那么递归中的“递”就是入栈,递进;“归”就是出栈,回归。


  我们可以通过一个更简单的程序来模拟递进和回归的过程:

  /*

  关于递归中递进和回归的理解*/

  publicstaticvoidrecursion_display(intn){

  inttemp=n;//保证前后打印的值一样

  System.out.println("递进:"+temp);

  if(n>0){

  recursion_display(--n);

  }

  System.out.println("回归:"+temp);

  }

  递归的例子


  斐波那契数列


  斐波那契数列的递推公式:Fib(n)=Fib(n-1)+Fib(n-2),指的是如下所示的数列:


  1、1、2、3、5、8、13、21.....


  按照其递推公式写出的递归函数如下:

  publicstaticintfib(intn)throwsException{

  if(n<0)

  thrownewException("参数不能为负!");

  elseif(n==0||n==1)

  returnn;

  else

  returnfib(n-1)+fib(n-2);

  }

  递归调用的过程像树一样,通过观察会发现有很多重复的调用。


Java基础学习:java怎么递归函数


  归并排序


  归并排序也是递归的典型应用,其思想:将序列分为若干有序序列(开始为单个记录),两个相邻有序的序列合并成一个有序的序列,以此类推,直到整个序列有序。

  //递归过程是:在递进的过程中拆分数组,在回归的过程合并数组

  publicstaticvoidmergeSort(int[]source,int[]temp,intfirst,intlast){

  if(first<last){

  intmid=(first+last)/2;

  mergeSort(source,temp,first,mid);//归并排序前半个子序列

  mergeSort(source,temp,mid+1,last);//归并排序后半个子序列

  merge(source,temp,first,mid,last);//在回归过程中合并

  }elseif(first==last){//待排序列只有一个,递归结束

  temp[first]=source[first];

  }

  同样调用过程向树一样,但是它并没有重复调用的问题。在递进的过程中拆分数组,在回归的过程合并数组。通过递归来实现归并排序,程序结构和条理非常清晰。

Java基础学习:java怎么递归函数


    以上就是动力节点Java培训机构小编介绍的“Java基础学习:java怎么递归函数”的内容,希望对大家有帮助,如有疑问,请在线咨询,有专业老师随时为你服务。


提交申请后,顾问老师会电话与您沟通安排学习

免费课程推荐 >>
技术文档推荐 >>