递归在java语言中的应用


一 . 两个小经验
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任务执行的类传递参数,怎么做?这个问题还在探讨中...请高手指教.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值