递归以及递归的简单使用(递归求和、递归求阶乘、递归遍历全目录、递归计算斐波那契数列)

深藏阁楼爱情的钟 2022-05-26 05:19 278阅读 0赞

递归,指在当前方法内调用自己的现象。

  1. public void method(){
  2. System.out.println(“递归的演示”);
  3. //在当前方法内调用自己
  4. method();
  5. }

递归分为两种:直接递归(方法自身直接调用自己)和间接递归(可以A方法调用B方法,B方法调用C方法,C方法再调用A方法)。

1.计算1~n的和,使用递归完成

  1. import java.util.Scanner;
  2. public class DiGuiDemo {
  3. public static void main(String[] args) {
  4. //计算1~num的和,使用递归完成
  5. System.out.println("现在计算1~n的和");
  6. System.out.println("请输入n的值:");
  7. Scanner in = new Scanner(System.in);
  8. int n = in.nextInt();
  9. int sum = getSum(n);
  10. System.out.println("1~"+n+"的和为:"+sum);
  11. }
  12. public static int getSum(int n) {
  13. if(n == 1){
  14. return 1;
  15. }
  16. return n + getSum(n-1);
  17. }
  18. }

运行结果为:

70

注意:递归 一定要有条件限定,保证递归能停止,否则会发生栈内存溢出。

在递归中虽然有限定条件,但是递归次数不能太多,否则也会发生栈内存溢出。

2.递归求阶乘

  1. import java.util.Scanner;
  2. public class DiGuiDemo {
  3. public static void main(String[] args) {
  4. System.out.println("请输入n,将计算n的阶乘:");
  5. Scanner in = new Scanner(System.in);
  6. int n = in.nextInt();
  7. System.out.println(n+"!="+getJieCheng(n));
  8. }
  9. /*
  10. * 计算阶乘 5!
  11. * 5*4*3*2*1
  12. */
  13. public static int getJieCheng(int n){
  14. if ( n == 1)
  15. return 1;
  16. return n * getJieCheng(n-1);
  17. }
  18. }

运行结果为:

70 1

3.递归遍历全目录

  1. import java.io.File;
  2. /*
  3. * 对一个目录的下的所有内容,进行完全的遍历
  4. * 使用方法的递归调用
  5. */
  6. public class FileDemo {
  7. public static void main(String[] args) {
  8. File dir = new File("d:\\code");
  9. getAllDir(dir);
  10. }
  11. /*
  12. * 定义方法,实现目录的全遍历
  13. */
  14. public static void getAllDir(File dir){
  15. System.out.println(dir);
  16. //调用方法listFiles()对目录,dir进行遍历
  17. File[] fileArr = dir.listFiles();
  18. for(File f : fileArr){
  19. //判断变量f表示的路径是不是文件夹
  20. if(f.isDirectory()){
  21. //是一个目录,就要去遍历这个目录
  22. //本方法,getAllDir,就是给个目录去遍历
  23. //继续调用getAllDir,传递他目录
  24. getAllDir(f);
  25. }else{
  26. System.out.println(f);
  27. }
  28. }
  29. }
  30. }

运行结果为:(得到d盘code文件夹中所有文件及子文件夹中的文件)

70 2

4.搜索指定目录中的Java文件(含子目录)

测试类

  1. import java.io.File;
  2. /*
  3. * 遍历目录,获取目录下的所有.java文件
  4. * 遍历多级目录,方法递归实现
  5. * 遍历的过程中,使用过滤器
  6. */
  7. public class DiGuiDemo {
  8. public static void main(String[] args) {
  9. getAllJava(new File("d:\\code"));
  10. }
  11. /*
  12. * 定义方法,实现遍历指定目录
  13. * 获取目录中所有的.java文件
  14. */
  15. public static void getAllJava(File dir){
  16. //调用File对象方法listFiles()获取,加入过滤器
  17. File[] fileArr = dir.listFiles(new MyJavaFilter());
  18. for(File f : fileArr){
  19. //对f路径,判断是不是文件夹
  20. if(f.isDirectory()){
  21. //递归进入文件夹遍历
  22. getAllJava(f);
  23. }else{
  24. System.out.println(f);
  25. }
  26. }
  27. }
  28. }

自定义过滤器接口

  1. import java.io.File;
  2. import java.io.FileFilter;
  3. public class MyJavaFilter implements FileFilter {
  4. public boolean accept(File pathname) {
  5. //判断获取的是目录,直接返回true
  6. if(pathname.isDirectory())
  7. return true;
  8. return pathname.getName().toLowerCase().endsWith(".java");
  9. }
  10. }

运行结果为:(找到d盘code目录中所有.java文件)

70 3

4.递归计算斐波那契数列

斐波那契数列指的是这样一个数列:1,1,2,3,5,8,13,21,34,55,89,144,233,377,610,987,1597……

这个数列的第一项和第二项都为1,从第3项开始,每一项都等于前两项之和。

  1. public class DiGuiDemo {
  2. public static void main(String[] args) {
  3. System.out.println(getFBNQ(12));
  4. }
  5. /*
  6. * 方法递归,计算斐波那契数列
  7. *
  8. */
  9. public static int getFBNQ(int month){
  10. if( month == 1)
  11. return 1;
  12. if( month == 2)
  13. return 1;
  14. return getFBNQ(month-1)+getFBNQ(month-2);
  15. }

运行结果为:

70 4

发表评论

表情:
评论列表 (有 0 条评论,278人围观)

还没有评论,来说两句吧...

相关阅读