黑马程序员_java基础知识总结(2)递归用法总结

------- 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语句相配合使用,递归有自己的好处也有弊端,使用者在使用前请做好判断。
最后,本博客在总结和书写上引用部分他人的观点和意见,在此声明!

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值