递归

递归

1.概述

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

  • 递归的分类:

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

    • 递归一定要有条件限定,保证递归能够停止下来,否则会发生栈内存溢出。
    • 在递归中虽然有限定条件,但是递归次数不能太多。否则也会发生栈内存溢出。
    • 构造方法,禁止递归
public class Demo01DiGui {
	public static void main(String[] args) {
		// a();
		b(1);
	}
    
    /*
     * 3.构造方法,禁止递归
     * 编译报错:构造方法是创建对象使用的,不能让对象一直创建下去
     */
    public Demo01DiGui() {
        //Demo01DiGui();
    }

    /*
     * 2.在递归中虽然有限定条件,但是递归次数不能太多。否则也会发生栈内存溢出。
     * 4993
     * 	Exception in thread "main" java.lang.StackOverflowError
     */
private static void b(int i) {
	System.out.println(i);
	//添加一个递归结束的条件,i==5000的时候结束
	if(i==5000){
		return;//结束方法
	}
	b(++i);
}

/*
 * 1.递归一定要有条件限定,保证递归能够停止下来,否则会发生栈内存溢出。 Exception in thread "main"
 * java.lang.StackOverflowError
 */
private static void a() {
	System.out.println("a方法");
	a();
}
}

2.累加递归

public class Demo2Recurison {
    public static void main(String[] args) {
        System.out.println( lj(5));
    }
    /*
        定义一个方法,使用递归计算1-n之间的和
        1+2+3+...+n
        n+(n-1)+(n-2)+...+1
        已知:
            最大值:n
            最小值:1
        使用递归必须明确:
            1.递归的结束条件
                获取到1的时候结束
            2.递归的目的
                获取下一个被加的数字(n-1)
     */
    private static int lj(int n) {
        if(n==1){
            //return为中止条件
            return 1;
        }
        return n+lj(n-1);
    }
}

3.累乘递归

/*
    练习:
        使用递归计算阶乘
        n的阶乘:n! = n * (n-1) *...* 3 * 2 * 1
 */
public class Demo03Recurison {
    public static void main(String[] args) {
        System.out.println(  jc(3));
    }

    /*
    定义方法使用递归计算阶乘
        5的阶乘: 5! = 5*(5-1)*(5-2)*(5-3)*(5-4)=5*4*3*2*1
        递归结束的条件
            获取到1的时候结束
        递归的目的
            获取下一个被乘的数字(n-1)
        方法的参数发生变化
            5,4,3,2,1
     */
    private static int jc(int n) {
        //确定最终的值返回
        if (n==1){
            return 1;
        }

        //获取下一个被乘的数
       return n*jc(n-1);
    }
}

4.利用递归遍历多级目录

/*
    练习:
        递归打印多级目录
 */
import java.io.File;

public class Demo04Recurison {
    public static void main(String[] args) {
        File file = new File("D:\\WorkPlace\\jinjie\\src");
        getAllFile(file);
    }
    
    public static void getAllFile(File dir){
        System.out.println(dir.getName());//dir的toString方法也是调用getName
        if(dir.isDirectory()){
            for (File s : dir.listFiles()) {
                //递归的目的:对下一个文件夹遍历
                    getAllFile(s);
                System.out.println(s);
            }
        }else {
            System.out.println(dir);
        }

    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值