Java 之 递归

一、概述

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

  递归的分类

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

  注意

    •  递归一定要有条件限制,保证递归能够停止下来,否则会发生栈内存溢出。
    •     在递归中虽然有限定条件,但是递归次数不能太多,苟泽也会发生栈内容溢出。
    •     构造方法,进制递归。

  递归导致栈内存溢出的原理:

  

二、案例

  1、递归累加求和

    计算 1~ n 的和,n 的累加 = n + (n+1) 的累和,可以把累和的操作定义成一个方法,递归调用。

    实现:

 1 public class Demo {
 2     public static void main(String[] args) {
 3         //计算1~num的和,使用递归完成
 4         int num = 5;
 5         // 调用求和的方法
 6         int sum = getSum(num);
 7         // 输出结果
 8         System.out.println(sum);
 9     } 
10     /*
11         通过递归算法实现.
12         参数列表:int
13         返回值类型: int
14     */
15     public static int getSum(int num) {
16         /*
17         num为1时,方法返回1,
18         相当于是方法的出口,num总有是1的情况
19         */
20         if(num == 1){
21             return 1;
22         }
23         /*
24         num不为1时,方法返回 num +(num‐1)的累和
25         递归调用getSum方法
26         */
27         return num + getSum(num‐1);
28     }
29 }

 

  代码执行图解

 

    注意递归一定要有条件限定,保证递归能够停止下来,次数不要太多,否则会发生栈内存溢出。

  2、递归求阶乘

    阶乘:所有小于及等于该数的正整数的积。

    分析:n! = n * (n-1);

    实现:

 1 public class DiGuiDemo {
 2     //计算n的阶乘,使用递归完成
 3     public static void main(String[] args) {
 4         int n = 3;
 5         // 调用求阶乘的方法
 6         int value = getValue(n);
 7         // 输出结果
 8         System.out.println("阶乘为:"+ value);
 9       }
10  /* 
11     通过递归算法实现.
12     参数列表:int
13     返回值类型: int
14     */
15     public static int getValue(int n) {
16         // 1的阶乘为1
17         if (n == 1) {
18             return 1;
19         } 
20         /*
21         n不为1时,方法返回 n! = n*(n‐1)!
22        递归调用getValue方法
23         */
24         return n * getValue(n ‐ 1);
25     }
26 }

  3、递归打印多级目录

    分析:多级目录的打印,就是当目录的嵌套。遍历之前,无从知道到底有多少级目录,所以我们还是要使用递归实现。

    实现:

 1 public class DiGuiDemo {
 2     public static void main(String[] args) {
 3         // 创建File对象
 4         File dir = new File("D:\\aaa");
 5         // 调用打印目录方法
 6         printDir(dir);
 7     } 
 8     public static void printDir(File dir) {
 9         // 获取子文件和目录
10         File[] files = dir.listFiles();
11         // 循环打印
12         /*
13         判断:
14         当是文件时,打印绝对路径.
15         当是目录时,继续调用打印目录的方法,形成递归调用.
16         */
17         for (File file : files) {
18             // 判断
19             if (file.isFile()) {
20                 // 是文件,输出文件绝对路径
21                 System.out.println("文件名:"+ file.getAbsolutePath());
22             } else {
23                 // 是目录,输出目录绝对路径
24                 System.out.println("目录:"+file.getAbsolutePath());
25                 // 继续遍历,调用printDir,形成递归
26                  printDir(file);
27             }
28         }
29   }
30 }

 

 

 

 

转载于:https://www.cnblogs.com/niujifei/p/11482041.html

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值