`
senton
  • 浏览: 205727 次
  • 性别: Icon_minigender_1
  • 来自: 紫禁城
社区版块
存档分类
最新评论

递归在java语言中的应用

    博客分类:
  • J2SE
阅读更多


一 . 两个小经验
  1.在定义一个类时,不要随意定义成员变量.除非它是这个类的一个属性或者在类的多个方法中要用到 它.

  2.
   public class Test  {
      public static void main(String[] args)  {
         byte[] b = new byte[102400*1024];
      }
   }
   这是一个简单的程序,在写上传文件的程序时极有可能遇到这个情况.比喻说有一个文件的长度是100M.  在读取文件内容时就会这样写byte[] b = new   byte[102400*1024],但是在运行时会出一个内存越界错误.在实际应用中一定要非常小心.
 
二 . 递归:
  先看一个小例子:
    public class Recursion {
       public static void func() {
          func();
       }
       public static void main(String[] args)  {
          func();
       }
    }
  上面就是一个简单的递归程序,运行一定会把内存吃光,所以在使用递归时一定要加上特定的条件
  
  下面再看几个递归的例子.
  (1) .
  public class YueShuTest { 
   //求最大公约数
     public static void yueshu(int num1,int num2) {
         if(num1 == num2) {
            System.out.println (num1);
         }
        else  {
            yueshu(Math.abs(num1 - num2),Math.min(num1,num2));
        }
   }
 
   //求二进制
   public static void binary(int num) {
       if(num > 0) {
          binary(num / 2);
          System.out.print (num % 2);
       }
    }  
  }
  下面在看一个最经典的汉诺塔问题(很复杂的一个问题).
  public class Hanon {
     static void hanon(int n,char a,char b,char c) {
         if(n == 1) {
            move(1,a,c);
            return;
        }  
        hanon(n - 1,a,c,b);
        move(n,a,c);
        hanon(n - 1,b,a,c); 
     }
   
     static void move(int n,char a,char c) {
         System.out.println (n + ":" + a + "-->" + c);
      }
   
      public static void main(String[] args) {
         hanon(3,'A','B','C');
      }
 }
 看看,一个多么复杂的问题这么几行代码就搞定了.递归的威力无穷啊!
 再来看一个更复杂的.
  import java.io.*; 
  class FileWrapper extends File {
    private boolean bLast = false;
    private FileWrapper parent = null;
    public FileWrapper(File f,boolean bLast,FileWrapper parent) {
      super(f.getPath());
      this.parent = parent;
      this.bLast = bLast;
    }
   
    public FileWrapper getMyParent() {
     return parent;
    }
   
   public boolean isLast() {
     return bLast;
    } 
  }
  
  
  public class FileTree{
   //第一种方法.
    /*public static String makeSpaces(int level) {
    StringBuffer sbf = new StringBuffer();
    for (int i = 0; i < level; i++)
       {
        sbf.append("   ");
       }
       return sbf.toString();
   }
   
   public static void listFile(File f,int level)
   {
    if(!f.exists())
    {
     System.out.println ("该文件不存在!");
     return;
    }
    
    System.out.println (makeSpaces(level) + f.getName());
    if(f.isDirectory())
    {
     File[] fs = f.listFiles();
     for(File file : fs)
     {
      listFile(file,(level + 1));
     }
    }
   }
   
   public static void main(String[] args)
      {
       File file;
       if(args.length < 1)
       {
        file = new File(".");
       }
       else
       {
        file = new File(args[0]);
       }
       listFile(file,0);
      }
   */
   这段代码打印出来的结果如下:
   
   //第二种方法
      public static void listFile(FileWrapper fw)
      {
       if(!fw.exists())
       {
        System.out.println ("该文件不存在!");
        return;
       }
       
       System.out.println (makePrefix(fw) + fw.getName());
       if(fw.isDirectory())
       {
        File[] fs = fw.listFiles();
           for (int i = 0 ;i < fs.length;i++)//File fl : fs)
           {
            File f1 = fs[i];
            FileWrapper fw1 = null;
            if(i == fs.length - 1)
            {
             fw1 = new FileWrapper(f1,false,fw);
            }
            else
            {
             fw1 = new FileWrapper(f1,true,fw);
            }
               listFile(fw1);
           }
           
       }       
      }
     
      public static void main(String[] args)
      {
       File file;
       if(args.length < 1)
       {
        file = new File(".");
       }
       else
       {
        file = new File(args[0]);
       }
       FileWrapper fw = new FileWrapper(file,true,null);
       listFile(fw);
      }
     
      public static void makeParentPrefix(FileWrapper fw,StringBuffer prefix)
      {
       if(fw.getMyParent().getMyParent() == null)
       {
        return;
       }
       
       FileWrapper parent = fw.getMyParent();
       if(parent.isLast())
       {
        prefix.append("  │"); 
       }
       else
       {
        prefix.append("    ");
       }
       
       makeParentPrefix(parent,prefix);
      }
     
      public static String makePrefix(FileWrapper fw)
      {     
       if(fw.getMyParent() == null)
       {
          return "";
       }
       
       StringBuffer sbf = new StringBuffer();
       if(fw.isLast())
       {
        sbf.append("─├");
       }
       else
       {
        sbf.append("─└");
       }
       
       makeParentPrefix(fw,sbf);
       sbf.reverse();
       return sbf.toString();
      }
  }
  这段代码打印出来的结果如下:


三 . 要在执行ant的命令行窗口中给build.xml中的java任务执行的类传递参数,怎么做?这个问题还在探讨中...请高手指教.

分享到:
评论

相关推荐

    递归与迭代算法及其在JAVA语言中的应用.pdf

    递归与迭代是算法设计中两种常见的解决问题的方法,它们在Java语言中的应用广泛且具有深远的意义。递归算法通过方法内部调用自身来解决问题,它适合于可以分解为相似子问题的问题;而迭代算法则通过循环结构,不断...

    递归在java语言中的应用.pdf

    本篇文章将深入探讨递归在Java语言中的应用,并通过实例来解析递归的工作原理。 首先,递归的基础是必须有一个明确的终止条件,以防止无限循环导致程序崩溃。在给定的示例中,`YueShuTest` 类展示了如何使用递归来...

    0-1背包递归求解Java语言描述

    Java语言中实现0-1背包的递归解法通常会使用一个二维数组dp,其中dp[i][j]表示在前i个物品中,容量为j时的最大价值。递归函数可以如下表示: ```java int knapsack(int W, int[] w, int[] v, int n) { int[][] dp ...

    递归与迭代算法及其在JAVA语言中的应用.zip

    在编程世界中,递归和迭代是两种基本的解决问题的方法,尤其在Java语言中,它们在...在阅读“递归与迭代算法及其在JAVA语言中的应用.pdf”这份资料后,相信你将对这两者有更深入的理解,并能灵活地应用到实际项目中。

    Java语言描述递归删除

    Java语言中的递归删除是一种常见的文件操作,尤其在处理文件夹结构时非常有用。递归是一种编程技术,它允许函数或方法调用自身来解决复杂问题。在这个Java程序中,递归被用来遍历和删除指定目录及其子目录中的所有...

    递归的高级应用java代码

    总结来说,递归是编程中的重要概念,尤其在Java这样的面向对象语言中,它可以优雅地解决复杂问题。通过理解和应用递归,我们可以更好地掌握编程的艺术,而汉诺塔问题的递归解法则是学习这一技巧的一个良好起点。

    java培训知识-递归

    递归是一种重要的编程概念,尤其在Java这样的面向对象语言中,它被广泛应用于解决各种复杂问题。递归指的是一个函数或方法在其定义中调用自身的过程。这种技术源自数学和计算机科学,它允许通过简化问题的规模来解决...

    java详细讲解递归

    在Java编程语言中,递归是一种非常重要的算法思想和技术手段。递归是指一个方法直接或间接地调用自身的过程。这种自我调用的方式可以用来解决很多复杂的问题,并且通常能够使代码更加简洁和易于理解。 #### 二、...

    java递归

    5. **尾递归优化**:在某些编程语言中(如Scala),支持尾递归优化,即在递归调用是函数体的最后一个操作时,编译器可以重写递归调用来避免额外的栈帧分配。遗憾的是,标准的Java并不支持尾递归优化。 6. **调试...

    Java递归算法构造JSON树形结构

    Java 递归算法构造 JSON 树形结构是指通过 Java 语言使用递归算法将数据库中的菜单表构建成树形的 JSON 格式发送给第三方。这种方法可以将复杂的树形结构数据转换成易于理解和处理的 JSON 格式。 在 Java 中,使用...

    用Java集合递归实现通用树Tree

    Java集合框架是Java语言提供的一组接口和类,用于存储和操作各种数据结构,如列表(List)、队列(Queue)、集(Set)和映射(Map)。然而,标准的集合框架并没有直接提供对树结构的支持,因此我们需要自己创建。 ...

    java程序的递归算法

    在Java编程语言中,递归同样被广泛应用,尤其是在处理文件系统操作时。 #### 一、递归算法的基本概念 递归通常涉及两个主要部分: 1. **基本情况**(Base Case):这是递归调用的结束条件。 2. **递归步骤**...

    java递归实现 阶乘

    在这个实例中,我们将深入探讨如何使用Java递归实现阶乘计算,并以1到10的数字为例进行演示。 阶乘是一个数学概念,表示一个正整数n的所有小于等于n的正整数的乘积,通常表示为n!。例如,5的阶乘(5!)是5 × 4 × ...

    java数据结构递归算法

    在这个"java数据结构递归算法"主题中,我们将深入探讨递归的基本概念、如何在Java中使用递归,以及一个著名的递归应用案例——八皇后问题。 递归是函数或方法调用自身的过程。它基于一个问题的规模缩小至基本情况,...

    二叉树的遍历(递归+非递归 Java语言版)

    在`MyBinaryTree2.java`和`MyBinaryTree.java`这两个文件中,可能分别实现了递归和非递归的遍历方法。你可以打开这些文件,查看代码并理解其中的逻辑,以加深对二叉树遍历的理解。此外,实践是最好的老师,你可以...

    java递归实现N个数全排列输出

    在这个场景中,我们将探讨如何使用Java语言,通过回溯法来递归实现全排列的输出。 首先,我们需要理解回溯法的基本概念。回溯法是一种试探性的解决问题的方法,它尝试逐步构建解决方案,并在每一步中检查当前的解...

    java实现的二叉树的递归和非递归遍历

    在Java编程语言中,二叉树是一种非常重要的数据结构,它由节点构成,每个节点包含一个值,并且可能有两个子节点:左子节点和右子节点。二叉树的遍历是访问每个节点的过程,通常分为三种主要方式:前序遍历、中序遍历...

    JAVA语言程序设计(郎波主编)例题

    在JAVA语言的学习中,理解并掌握基本语法是首要任务。这包括数据类型(如整型、浮点型、字符型和布尔型)、变量、常量的声明与使用,以及运算符的规则。例如,书中可能有涉及算术运算符(+、-、*、/、%)和关系...

    可并行递归算法的递归多线程实现

    本文旨在探讨如何在递归算法中运用多线程技术,以实现高效的并行计算。 #### Java多线程框架与递归算法结合 Java作为一门广泛使用的高级编程语言,其内置的多线程机制为开发者提供了丰富的工具,以便在多核架构上...

    用java实现的经典递归算法

    本文主要探讨如何使用Java实现经典递归算法,旨在帮助初学者理解递归的工作原理及其应用。递归算法设计的关键在于将复杂问题分解为相似的子问题,直到子问题简单到可以直接解决。这通常涉及到两个要素:递归出口和...

Global site tag (gtag.js) - Google Analytics