(十)java递归

     递归:一个过程(方法)直接或间接的调用自己本身,这个过程叫做递归。
例如这样一个小程序:
package demo;
public class Demo {
   public static void main(String[] args) {
Demo5 demo=new Demo5();
int num=demo.test(3);//int num=demo.test(4);int num=demo.test(5);
System.out.println(num);
   }
}
class Demo5 {
  public int test(int a){
       int result;
       if(a==1){
       return 1;
       }
      //调用test方法本身,实现递归
result=test(a-1)*a;
return result;
  }
}
     这个程序中,类Demo5中的test方法里边又调用了test方法本身,这就是递归。在main方法中运行的时候,当参数是3时,输出的num结果是6;参数是4时,结果是24;参数是5时,结果是120.
这些结果得来的过程是这样的:
     1.当参数是3时,也就是int num=demo.test(3);这个时候会进入到test方法中,首先经过if判断a!=1,因此直接走下一步,也就是result=test(3-1)*3,即result=test(2)*3;
因为这里又有test方法,参数是2,因此会在这里再次调用test方法,下一步再if判断,依旧是a!=1,则test(2)的结果就是test(1)*2;
     那么上一步中result=test(2)*3中的test(2)就要进行替换,结果是result=test(1)*2*3;
走到这一步以后,程序并没有结束,因为这里边依旧还有test方法,那么会再次调用test,再次if判断,这时候a==1,则return 1;也就是test(1)=1;
     那么,上边的结果将会再次变化,即:num=result=test(1)*2*3=1*2*3=6。这就是当参数是3的时候,结果是6的递归运行过程。
     2.同样的,当参数是4的时候,也就是int num=demo.test(4);首先a!=1,那么运行到下一步就是result=test(3)*4;紧接着,test(3)之后的运行步骤就和参数是3的时候一样,那么最终的结果就是:num=result=test(3)*4=1*2*3*4=24;
     3.那么当参数是5的时候,按照上边的步骤,也就是将会在最开始的时候编程test(4)*5,那么结果就是24*5=120.
 再例如下边的求累加和的例子:
package demo;
public class Test1 {
   public static void main(String[] args) {
Demo11 demo=new Demo11();
int num=demo.test(3);//int num=demo.test(4);int num=demo.test(3)
System.out.println(num);
   }
}

class Demo11{
public int test(int n){
int sum;
if(n>0){
                     //调用test方法本身实现递归
sum=n+test(n-1);
return sum;
}else{
return 0;
}
}
}   
    这个例子是求比我们指定的正整数小的所有正整数的和,在Demo11类中的test方法中又调用了test方法本身,这里用到了递归。
    在这个例子中,参数是3的时候,结果是6;参数是4的时候,结果是10;参数是5的时候,结果是15。它的具体实现过程是这样的:
    1.当参数是3的时候,也就是n=3,首先if判断n>0,那么sum=3+test(2);紧接着test(2)再次if判断n>0,结果是2+test(1);那么整个sum结果就会变成sum=3+test(2)=3+2+test(1);
再然后,继续test(1),结果是1+test(0);再然后继续test(0),n=0,return 0,结果是0;那么整个sum的结果就是sum=3+2+1+0=6。
    2.当参数是4的时候,n=4,同样的,首先是sum=4+test(3),然后就是重复test(3)的步骤,结果是sum=4+test(3)=4+3+2+1+0=10。
     3.再到参数是5的时候,n=5,那么一开始if之后就是sum=5+test(4);然后sum=5+4+3+2+1+0=15。
      我们以前读书的时候学过从1加到100的累加和,结果是5050,那么在这里如果把参数设为100,结果也是5050,是完全符合的,而计算的步骤也和上边的一样。
     递归的过程实际上可以看成是不断的调用不断的替换的过程,有人认为递归的优点是:采用递归算法比采用迭代算法要更加清晰和简单。
     在编写递归的时候,必须要使用if在递归调用不执行的时候强制方法返回,否则程序将永远不返回。

时间: 2025-01-29 16:35:35

(十)java递归的相关文章

Java递归遍历XML所有元素

做一个递归遍历XML的例子,为更为复杂的解析工作做基础. 目标:遍历所有的元素节点,并且取出来其中的值,结果打印到控制台. 源代码如下: 本程序依赖DOM4j包. import org.dom4j.Document; import org.dom4j.DocumentHelper; import org.dom4j.DocumentException; import org.dom4j.Element; import java.util.*; /** * Created by IntelliJ

java 递归 输入一个ID 怎么把这个ID下所有的子ID 放入一个list里面 递归都写好了

问题描述 java 递归 输入一个ID 怎么把这个ID下所有的子ID 放入一个list里面 递归都写好了 HashMap> results = new HashMap>(); //输入的ID int ID=Integer.parseInt(Catid); //表中所有的数据 aas=cloudnewscategory.selectAllGory(); System.out.println("所有记录="+aas); for (CloudNewsCategory gory :

递归原理-java 递归 有一个数组 1,2,2,3,5 用java打印出所有不同的排列顺序

问题描述 java 递归 有一个数组 1,2,2,3,5 用java打印出所有不同的排列顺序 有一个数组 1,2,2,3,5 用java打印出所有不同的排列顺序:如12235,12325,13225

树形 递归-java 递归报错 求大神帮忙

问题描述 java 递归报错 求大神帮忙 private List<Post> getPostLower(List<Post> PostTops){ List<Post> postAll=new ArrayList<Post>(); // 上级 for(Post post:PostTops){ //查询到下级 List<Post> posts=basService.queryPostByParentId(post.getPostId()); //

java类的问题-java递归原理求高人解惑

问题描述 java递归原理求高人解惑 int i=1;int Test(int n){ System.out.println(""*****************""+(i++)); int result =0; if(n==1) return 1; result = Test(n-1)*n; System.out.println(result+"" ""+n); return result;}我进行调试,比如n=8,只打印

java递归 if() return返回到哪里?

问题描述 java递归 if() return返回到哪里? 学习归并排序时,遇到递归的思想.测试输入 mergesortexample单步调试到,if (hi<=lo) return;当hi=0,lo=0时,执行return,在我理解中,return就是退出方法了,为何会跳到 sort(amid+1hi);而且此时,lo=0,hi=1? private static void sort(Comparable[] aint loint hi){ //将数组a[lo hi]排序 if (hi<=l

遍历-java递归删除目录的一个小问题

问题描述 java递归删除目录的一个小问题 import java.io.File; import java.io.FileNotFoundException; import java.io.PrintStream; import java.text.SimpleDateFormat; import java.util.Date; public class DeleteFilesDemo { public static void main(String[] args) throws FileNo

java 递归 树形结构-跪求∶用JAVA递归写数形结构,每级只需要一个树枝节点,无限递归,谢谢

问题描述 跪求∶用JAVA递归写数形结构,每级只需要一个树枝节点,无限递归,谢谢 用JAVA递归写数形结构,每级只需要一个树枝节点,无限递归,谢谢 解决方案 伪代码:void printNode(Node node){ for (Node cn in node.childNodes()) { printfNode(cn); } println(node.data);}

Java递归遍历树形结构_java

废话不多说了,直接给大家贴代码,具体代码如下所示: //菜单树形结构 public JSONArray treeMenuList(JSONArray menuList, int parentId) { JSONArray childMenu = new JSONArray(); for (Object object : menuList) { JSONObject jsonMenu = JSONObject.fromObject(object); int menuId = jsonMenu.ge

java 递归深入理解_java

一.递归函数,通俗的说就是函数本身自己调用自己... 如:n!=n(n-1)! 你定义函数f(n)=nf(n-1) 而f(n-1)又是这个定义的函数..这就是递归 二.为什么要用递归:递归的目的是简化程序设计,使程序易读 三.递归的弊端:虽然非递归函数效率高,但较难编程,可读性较差.递归函数的缺点是增加了系统开销,也就是说,每递归一次,栈内存就多占用一截 四.递归的条件:需有完成任务的语句,需满足递归的要求(减小而不是发散) 五.递归进阶: 1.用递归算n的阶乘:   分析:n!=n*(n-1)