Java 方法递归的思路详解

 更新时间:2022年04月14日 10:23:49   作者:Killing Vibe  
程序调用自身的编程技巧称为递归( recursion)。递归做为一种算法在程序设计语言中广泛应用。但是如果没终止条件会造成死循环,所以递归代码里要有结束自调自的条件,接下来讲解一下学习递归的思路

前言

今天给老铁们回顾一下递归的思路以及方法,也是给自己的一个归纳总结。

一、什么是方法递归

所谓的方法递归,就是在一个方法(函数)执行的内部,自己调用了自己的过程,称之为 “递归” 。

递归分为两个子过程:

  • 递过程:函数不断地调用自身,直到走到函数的终止条件,第一阶段结束。
  • 归过程:函数不断地返回的过程。

例如, 我们求 N! 起始条件: N = 1 的时候, N! 为 1. 这个起始条件相当于递归的结束条件. 递归公式: 求 N! ,

直接不好求, 可以把问题转换成 N! => N * (N-1)!

示例:递归求N的阶乘

public static void main(String[] args) {
    int n = 5;
    int ret = factor(n);
    System.out.println("ret = " + ret);
}
public static int factor(int n) {
    if (n == 1) {
        return 1;
   }
    return n * factor(n - 1); // factor 调用函数自身
}
// 执行结果
ret = 120

二、什么场景下能用递归

a.一个大问题(这个方法的功能)可以拆分成若干个子问题的解.

b.拆分后的子问题和原问题除了数据规模不同,解决思路完全相同.

c.必须存在递归的终止条件(不会无限拆分下去,一定能走到底~).

(看不懂先看下面(●ˇ∀ˇ●))

三、如何写出递归代码-重点

  • 先考虑这个函数的终止条件

比如上面的栗子:求N的阶乘。

拿求5的阶乘做例子:

在这里插入图片描述

我们把大问题(5的阶乘)一直拆分到1的时候,问题无法继续拆分下去了,这个子问题就是这个递归的最终条件。

所以我们写代码的时候,可以先把最终条件写上:

if (n == 1) {
        return 1;
   }
  • 假设这个函数已经写好了(注意这个方法的语义)

在写递归函数的时候,千万不要纠结这个函数内部是如何实现的,而是要注意这个函数有什么功能(假设这个函数别人已经写好了),我们把它当作一个黑盒子,你只是去调用这个函数罢了。

public static int factor(int n)

比如这个函数只能传入一个n,目前我们只能知道这个n是多少,而n的阶乘等于n* [(n-1)!],但是我们并不知道n-1的阶乘是多少,那么就调用这个别人写好的“黑盒子”。这个黑盒子的功能可以实现某个数的阶乘。

n * factor(n - 1) // n*黑盒子

说白了就是,把这个factor函数当作别人已经写好了,你只需要关注如何去调用这个方法去辅助你解决问题就可以了!

总结

写出递归其实=终止条件+利用黑盒子去解决剩下的问题,注意传入的参数就可以很快把递归代码写出来(●ˇ∀ˇ●)。

到此这篇关于Java 方法递归的思路详解的文章就介绍到这了,更多相关Java 递归内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • java开发就业信息管理系统

    java开发就业信息管理系统

    这篇文章主要为大家详细介绍了java开发就业信息管理平台,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2016-06-06
  • java利用udp实现发送数据

    java利用udp实现发送数据

    这篇文章主要为大家详细介绍了java利用udp实现发送数据,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-07-07
  • Java Web开发项目中中文乱码解决方法汇总

    Java Web开发项目中中文乱码解决方法汇总

    这篇文章主要为大家详细汇总了Java Web开发项目中中文乱码的解决方法,分析了5种Java Web中文乱码情况,感兴趣的小伙伴们可以参考一下
    2016-05-05
  • 详解Spring Boot中使用AOP统一处理Web请求日志

    详解Spring Boot中使用AOP统一处理Web请求日志

    本篇文章主要介绍了详解Spring Boot中使用AOP统一处理Web请求日志,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-05-05
  • Java文件处理之使用XWPFDocument导出Word文档

    Java文件处理之使用XWPFDocument导出Word文档

    最近因项目开发的需要,整理了一份用JAVA导出WORD文档,下面这篇文章主要给大家介绍了关于Java文件处理之使用XWPFDocument导出Word文档的相关资料,需要的朋友可以参考下
    2023-12-12
  • idea 自动生成类注释和方法注释的实现步骤

    idea 自动生成类注释和方法注释的实现步骤

    这篇文章主要介绍了idea 自动生成类注释和方法注释的实现步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-12-12
  • 详解Java函数式编程和lambda表达式

    详解Java函数式编程和lambda表达式

    这篇文章主要介绍了Java函数式编程和lambda表达式,对lambda感兴趣的同学,一定要看一下
    2021-04-04
  • Java集合继承体系详解

    Java集合继承体系详解

    这篇文章主要为大家详细介绍了Java集合继承体系,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-11-11
  • Java 3年面试经验告诉你Mybatis是如何进行分页的

    Java 3年面试经验告诉你Mybatis是如何进行分页的

    这篇文章主要介绍了Java 3年面试经验告诉你Mybatis是如何进行分页的,对于任何ORM框架,分页的实现逻辑无外乎两种,不管怎么包装,最终给到开发者的,只是使用上的差异而已,本文给大家讲解的很明白,感兴趣的朋友一起看看吧
    2022-09-09
  • Spring Boot配置动态更新问题

    Spring Boot配置动态更新问题

    这篇文章主要介绍了Spring Boot配置动态更新问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-09-09

最新评论