一,递归
概述:方法自己调用自己的现象叫做递归
递:传递 传递数据
归:回归【回到起点的意思】
传递数据到原点。每传递一个数据完成回到原点传递下一个数据;传递动作是重复, 只不过数据发生了变化而已。功能是唯一的。
把重复的动作封装成为一个方法,传递数据回归到原点的时候;再次调用方法传入新的数据就可以。这样的操作我们命名为递归。
特点描述:数据传递过程中最后传递数据会得到一个固定值,不需要再调用方法了。
特点体现:
方法自己调用自己。
肯定要有一个出口【要让递归停下来】
肯定有数据传递
弊端:不停的调用方法压栈,需要占用空间,如果内存空间小,递归没有执行完,程序结束
好处:代码简单,逻辑容易理解
所有的递归都可以被普通的逻辑取代,只不过设计起来比较难,容易错。
练习一
计算n这个数的1 ~ n的和【曾经求1~n的和使用的循环+计数思想】
分析:
n ------> 结果 方法【f(n)】 方法变形 最终变形
1 -----> 1 f(1) 1 1
2 ------> 1+2 f(2) f(1)+2 f(n-1)+n
3 ----------> 1+2+3 f(3) f(2)+3 f(n-1)+n
n -----------> 1+2+3+.....+n f(n) f(n-1)+n f(n-1)+n
n=1的时候返回1,其他的时候返回n加 n-1的累和
代码示例
public classDemo01 {public static voidmain(String[] args) {//method_For();//使用递归完成累和
int sum = getSum(100);
System.out.println(sum);//5050
int sum2 = getSum(1);
System.out.println(sum2);//1
}//定义一个求数累和的方法
public static int getSum(intn) {if (n == 1) {return 1;
}else{//getSum(n-1)就是上一个数的累和
return getSum(n-1)+n;
}
}private static voidmethod_For() {//定义一个计数器
int sum = 0;//使用计数思想【循环】完成1到100的累和
for (int i = 1; i <= 100; i++) {
sum+=i;
}
System.out.println(sum);
}
}
练习二
计算n的阶乘 例如:5!= 5 * 4 * 3 * 2 * 1
分析:
1 1
2 2=1*2 2的累乘是 1的累乘乘以 2
3 6=1*2*3 3的累乘是 2 的累乘 乘以3
每个数的阶乘是使用方法求出的,除了1的阶乘 其他数的阶乘都是上一个数的阶乘*这个数
n (n-1)的阶乘 * n
定义一个求数的阶乘的方法 getMul(int n )
n为1返回1,
其他数的返回 getMul(n-1)*n【上一个数的阶乘乘以数自己 上一个数的阶乘使用方法可以求出来】
代码示例
public classDemo02 {public static voidmain(String[] args) {//调用方法求5的阶乘
int mul = getMul(5);
System.out.println(mul);
}//求阶乘的方法
public static int getMul(intn) {if( n==1){return 1;
}else{return getMul(n-1)*n;
}
}
}
练习三
键盘录入一个文件夹路径,打印该文件夹中所有的文件的绝对路径
分析:
得到文件夹的file对象
文件夹里面的文件有的是文件有的是文件夹
如果是文件直接输出绝对路径,是文件夹就进一步获取这个文件夹的文件重复的判断里面的文件是不是文件是输出,不是再获取文件判断.....一直到没有文件夹为止
所以可以定义一个方法来获取文件夹文件并判断文件是不是文件,是输出路径,不是重新调用该方法
代码示例
import java.io.File;
import java.util.Sc