zoukankan      html  css  js  c++  java
  • 递归

    递归概念

    指在当前方法内调用自己的这种现象。

    递归的分类

    • 递归分为两种,直接递归和间接递归。
    • 直接递归称为方法自身调用自己。
    • 简介递归可以用A方法调用B方法,B方法调用C方法,C方法调用A方法。

    注意事项:

    • 递归一定要有条件限定,保证递归能够停止下来,否则会发生栈内存溢出。
    • 在递归中虽然有限定条件,但是递归次数不能太多。否则也会发生栈内存溢出。
    • 构造方法,禁止递归。

    递归的使用前提:

    当使用方法的时候,方法的主体不变,每次调用方法的参数不同,可以使用递归。

    构造方法,禁止递归的原因:

    编译报错:构造方法是创建对象使用的,一直递归会导致内存中有无数多个对象,直接导致编译报错。

    练习1:使用递归计算1-n之间的和

    代码演示:

    package day4;
    
    public class Demo01 {
        public static void main(String[] args) {
            int s = sum(3);
            System.out.println(s);
        }
    
        public static int sum(int n){
            if (n == 1){
                return 1;
            }
    
            return n + sum(n-1);
        }
    }
    

    注意:

    使用递归求和,main方法调用sum方法,sum方法会一直调用sum方法。导致在内存中有多个sum方法(频繁的创建方法,调用方法,销毁方法)效率低下。

    所以如果仅仅是计算(1-n)之间的和,不建议使用递归,使用for循环即可。

    练习2:递归求阶乘

    • 阶乘所有小于及等于该数的正整数的积。

      代码演示:

      package day4;
      
      public class Demo02 {
          public static void main(String[] args) {
              int s = a(5);
              System.out.println(s);
          }
      
          public static int a(int n){
              if (n == 1){
                  return 1;
              }
      
              return n * a(n-1);
          }
      }
      

      练习3:递归打印多级目录

      代码演示:

      package day4;
      
      import java.io.File;
      
      public class Demo03 {
          public static void main(String[] args) {
              File file = new File("C:\a");
              getAllFile(file);
          }
      
          public static void getAllFile(File dir){
              File[] files = dir.listFiles();
              for (File f:files){
                  if (f.isDirectory()){
                      getAllFile(f);
                      System.out.println(f);
                  }else {
                      System.out.println(f);
                  }
              }
          }
      }
      

      综合案例:文件搜索

      需求:

      1. 遍历多级文件目录,找出所有文件,打印。
      2. 将文件名转换为字符串,方便判断后缀。
      3. 使用String方法的endWith方法进行判断。

    代码演示:

    package day4;
    
    import javax.swing.*;
    import java.io.File;
    
    public class Demo04 {
        public static void main(String[] args) {
            File file = new File("C:\a");
            getFile(file);
        }
    
        public static void getFile(File dir){
            File[] files = dir.listFiles();
            for (File f:files) {
                if (f.isDirectory()){
                    getFile(f);
                } else {
                   String s = f.getName();
                   if (s.endsWith(".java")){
                       System.out.println(s);
                   }
    
                }
            }
        }
    }
    
  • 相关阅读:
    挺有意思的HBase日志+Splunk
    eclipse连接远程hadoop集群开发时权限不足问题解决方案
    auxiliary variable(辅助变量)的引入
    auxiliary variable(辅助变量)的引入
    十万个为什么 —— 自然的好奇
    十万个为什么 —— 自然的好奇
    高级鸡汤
    高级鸡汤
    protobuf反射详解
    思想实验(逻辑思维)解题
  • 原文地址:https://www.cnblogs.com/Xiaoming0/p/13917163.html
Copyright © 2011-2022 走看看