【Java成王之路】第五篇:Java SE(方法递归)

画图分析:

例题:求n的和

例题:递归实现按照顺序打印每一位的数字

实现代码:

例题:求第n个斐波那契数是几

总结:

我与你同在。


一、递归的概念

=======

1.什么是递归?

递归就是:方法自己调用方法的过程。

使用递归有两个前提条件:

1.有一个趋近与终止的条件。

2.自己调用自己 。

如何实现递归?

最重要的方式是:实现递归,需要去推导出一个递推公式。

思考递归的方式:横向思考,根据递推公式来思考。

代码的执行:是纵向执行。

2.递归讲解

=======

首先看下面代码:

public class TestDemo {

public static void func(){
    func();   //自己调用自己本身
}
public static void main(String[] args) {
    func();
}

}

上图代码就是一个简单的递归。

我们再来看一下这个代码的运行结果,

画图讲解:

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAS-WqvuKAjQ==,size_20,color_FFFFFF,t_70,g_se,x_16

对于上图这个递归来说,根本没有一个趋于终止的条件,所以这个函数会无休止的递归下去。每次递归都要在栈上开辟内存,一直在栈上开辟内存,总有一次会栈超出。

老铁们要记住:一旦你写的递归有问题,如果是边界没找对一定会报一个7ae60fddda4c4c9183eef750dc310410.png,如果报了这个错误那么一定是你的终止条件有错误,或者是没写终止条件导致了你在递归的过程当中深度过大,最终栈溢出。

如果想要让上述代码正确,我们需要给它加入一个终止条件。

正确代码如下:

public class TestDemo {

public static void func(int n){
    if(n == 1) return;
    func(n -1);
}
public static void main(String[] args) {
    func(3);
}

}

下面会通过简单的例题让大家更加深入的了解递归

三、递归的使用

========

例题:递归方式求n的阶乘

画图分析:

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAS-WqvuKAjQ==,size_20,color_FFFFFF,t_70,g_se,x_16

实现代码 :

public class TestDemo {

public static int fac(int n){
    if(n == 1) {
        return 1;
    }
    int tmp = n * fac(n - 1);
    return tmp;
}
public static void main(String[] args) {
    System.out.println(fac(5));
}

}

代码画图讲解:

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAS-WqvuKAjQ==,size_20,color_FFFFFF,t_70,g_se,x_16

例题:求n的和

画图分析

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAS-WqvuKAjQ==,size_20,color_FFFFFF,t_70,g_se,x_16

实现代码:

第一种写法:

public class TestDemo {

public static int sumAdd(int n){
    if(n == 1) {
        return 1;
    }
    int tmp = n + sumAdd(n - 1);
    return tmp;
}
public static void main(String[] args) {
    System.out.println(sumAdd(3));
}

}

第二种写法:

public class TestDemo {

public static int sumAdd(int n){
    if(n == 1) {
        return 1;
    }
    return n + sumAdd(n -1);
}
public static void main(String[] args) {
    System.out.println(sumAdd(3));
}

}

例题:递归实现按照顺序打印每一位的数字

画图分析:

一线互联网大厂Java核心面试题库

image

正逢面试跳槽季,给大家整理了大厂问到的一些面试真题,由于文章长度限制,只给大家展示了部分题目,更多Java基础、异常、集合、并发编程、JVM、Spring全家桶、MyBatis、Redis、数据库、中间件MQ、Dubbo、Linux、Tomcat、ZooKeeper、Netty等等已整理上传,感兴趣的朋友可以看看支持一波!
(sumAdd(3));

}

}

例题:递归实现按照顺序打印每一位的数字

画图分析:

一线互联网大厂Java核心面试题库

[外链图片转存中…(img-131kJVQh-1721880090470)]

正逢面试跳槽季,给大家整理了大厂问到的一些面试真题,由于文章长度限制,只给大家展示了部分题目,更多Java基础、异常、集合、并发编程、JVM、Spring全家桶、MyBatis、Redis、数据库、中间件MQ、Dubbo、Linux、Tomcat、ZooKeeper、Netty等等已整理上传,感兴趣的朋友可以看看支持一波!

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值