------- android培训、java培训、期待与您交流! ----------
简单说递归就是程序本身调用本身的一种编程技巧。
递归的三个条件:
边界条件
递归前进段
递归返回段
当边界条件不满足时,递归前进;当边界条件满足时,递归返回。
递归算法解决问题的特点:
(1) 递归就是在过程或函数里调用自身。
(2) 在使用递增归策略时,必须有一个明确的递归结束条件,称为递归出口。
(3) 递归算法解题通常显得很简洁,但递归算法解题的运行效率较低,即占用内存很大,有时这种情况用栈来代替解决。所以一般不提倡用递归算法设计程序。
(4) 在递归调用的过程当中系统为每一层的返回点、局部量等开辟了栈来存储。递归次数过多容易造成栈溢出等。所以一般不提倡用递归算法设计程序。
通过一些小程序我们可以更好地理解递归
需求1:递归方法sum,求1+2+...+100 的求和
public static int sum(int num){
if(num > 0){
return num + sum(num-1); //调用递归方法
}else{
return0; //当num=0时,循环结束
}
}
需求2: 求1000!后面有多少个零
* 1000 * 999 * 998 ....1
* 10!
* 5 * 2 = 10
* 10 * 10 = 100
* 20!
* 5 10 15 20 = 4个零
* 30!
* 5 10 15 20 25 30 +
* 100!
* 20 + 20 / 5
* 1000!
* 200 + 200 / 5 + 40 / 5 + 8 / 5
* 125 250 375 500 625 750 875 1000
*/
public static void main(String[] args) {
int sum = getZero(1000);
System.out.println(sum);
}
public static int getZero(int num) {
int count = 0; //定义计数器
BigInteger bi1 = new BigInteger("1"); //创建BigInteger对象初始值为1
for(int i = 1; i <= num; i++) { //遍历
BigInteger bi2 = new BigInteger(""+i); //用遍历到的数字创建BigInteger对象
bi1 = bi1.multiply(bi2); //求阶乘
}
String str = bi1.toString(); //将BigInteger对象转换成字符串
for(int i = 0; i < str.length(); i++) { //遍历字符串
if(str.charAt(i) == '0') { //如果字符串中的字符和0字符相等
count++; //计数器自增
}
}
return count; //将计数器返回
}
}
/**
*需求3,从键盘输入接收一个文件夹路径,打印出该文件夹下所有的.java文件名
*/
public static void main(String[] args) {
File dir = Test3.getDir();
getJavaFile(dir);
}
public static void getJavaFile(File dir) { //传入一个文件夹路径
File[] subFiles = dir.listFiles(); //获取该文件夹路径所有的文件和文件夹
for (File subFile : subFiles) { //遍历这些文件和文件夹
if(subFile.isFile() && subFile.getName().endsWith(".java")) { //如果是文件并且后缀名是.java
System.out.println(subFile); //打印.java文件
}else if(subFile.isDirectory()) { //如果是一个路径
getJavaFile(subFile); //再调用一次方法,找到这个路径下的所有的.java文件
}
}
}
}
递归的每次调用自身都有以下几个特点的体现:
(1),每次调用在规模上都会缩小,体现一种层级关系
(2),相邻两次调用之间关系密切,一般为上一次输出为下一次的输入
(3),当达到某一临界点或者条件是,会自动调出循环(这点必须具备),这样子可以避免进入死循环
在递归的调用上,一般与if—else语句相配合使用,递归有自己的好处也有弊端,使用者在使用前请做好判断。
最后,本博客在总结和书写上引用部分他人的观点和意见,在此声明!