Java 精炼解读递归的概念与使用

目录
  • 一、递归的概念
    • 1.什么是递归?
    • 2.递归讲解
  • 二、递归的使用 
  • 总结:

一、递归的概念

1.什么是递归?

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

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

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

2.自己调用自己 。

如何实现递归?

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

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

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

2.递归讲解

首先看下面代码:

public class TestDemo {
    public static void func(){

        func();   //自己调用自己本身
    }

    public static void main(String[] args) {
        func();

    }
}

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

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

画图讲解:

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

老铁们要记住:一旦你写的递归有问题,如果是边界没找对一定会报一个

,如果报了这个错误那么一定是你的终止条件有错误,或者是没写终止条件导致了你在递归的过程当中深度过大,最终栈溢出。

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

正确代码如下:

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的阶乘 画图分析:

实现代码 :

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));

    }
}

代码画图讲解:

例题:求n的和

画图分析:

 实现代码:

第一种写法:
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));

    }
}

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

画图分析:

 实现代码:

public class TestDemo {

    public static void print(int n){
        if(n < 10){
            System.out.print(n+" ");
        }else{
            print(n/10);
            System.out.print(n%10+" ");
        }
    }
    public static void main(String[] args) {
        print(1234);

    }
}

例题:写一个递归方法,输入一个非负整数,返回组成它的数字之和。例如:输入1729,则应该返回1+7+2+9

实现代码:

public class TestDemo {

    public static int sumEveryone(int n){
        if(n < 10){
           return n;
        }else{
            return n%10 + sumEveryone(n/10);
        }
    }

    public static void main(String[] args) {
        System.out.println(sumEveryone(7910));

    }

}

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

画图分析:

实现代码:

第一种方法:递归
public class TestDemo {
    public static int fib(int n){
        if(n == 1 || n == 2){
            return 1;
        }else{
            return fib(n-2)+fib(n-1);
        }
    }
    public static void main(String[] args) {
        System.out.println(fib(5));

    }

第二种方法:叫做循环(迭代)实现
    public static int fib2(int n){
        if(n == 1 || n==2){
            return 1;
        }
            int f1 = 1;
            int f2 = 1;
            int f3 = 0;
            for (int i = 3; i < n; i++) {
                f3 = f1+f2;
                f1 = f2;
                f2 = f3;
            }
            return f3;

    }
    public static void main(String[] args) {
        System.out.println(fib2(45));

    }

总结:

本文简单介绍了什么是递归、递归讲解、递归如何使用。通过简单例题的方式加深对递归的印象。上述就是今天的内容,文章哪里出现了问题我都会积极改正,也希望大家能更快的掌握自己想要的知识,让我们一起加油!!!!!

到此这篇关于Java 精炼解读递归的概念与使用的文章就介绍到这了,更多相关Java 递归内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Java递归方法实现山脉绘制

    本文实例为大家分享了Java递归方法实现山脉绘制的具体代码,供大家参考,具体内容如下 一.山脉绘制的思路 给定两个点A(x1,y1),B(x2,y2),递归不断取中点,同时给定一个范围[-range,range]和一个比率rate.每次取中点后,这个中点的纵坐标的值加上这个范围内的随机值,同时通过range=range*rate来缩小这个变化的范围,最后,通过相邻的点连线,绘制成一个山脉的形状. 二.整段代码如下 package com.yf1031; import java.awt.FlowL

  • Java程序中方法的用法重载和递归

    目录 前言 一.方法的基本用法 1.什么是方法 2.方法的基本定义 3.方法调用的执行过程 4.方法中的实参和形参 二.方法的重载 1.重载的概念 2.例题分析 三.方法的递归 1.递归定义 2.例题分析 3.递归应用场景 总结 前言 "方法"又被称为"函数",其他的编程语言也有这个概念,重要性不言而喻,在这个文章,将介绍如何定义和使用方法. 一.方法的基本用法 1.什么是方法 在Java中,方法定义在类中,它和类的成员属性(数据成员)一起构建一个完整的类.构成方法

  • Java中方法的使用、重载与递归的详细介绍

    目录 一.方法的基本使用 1.什么是方法 2.方法基本语法 二.方法的重载 1.重载的作用 2.重载的使用规则 三.方法的递归 1.递归的概念 2.递归执行过程分析 3.递归练习 1.按顺序打印一个数字的每一位 2.递归求 1 + 2 + 3 + ... + 10 3.返回组成它的数字之和 4.求斐波那契数列的第 N 项 一.方法的基本使用 1.什么是方法 方法是一个代码片段,类似于C语言中的函数 2.方法基本语法 基本语法 // 方法定义 public static 方法返回值 方法名称(参数

  • java递归实现拼装多个api的结果操作方法

    工作需要,经常需要实现api接口,但每次都是大同小异,我就考虑是否可以将这种重复性的工作配置化. 我就写一个模板api,然后所有的HTTP请求过来,根据不同的配置返回不同结果. 最开始考虑的是比较简单的,来一个api需求,我就去MySQL查一条这个api对应的SQL,然后拿SQL去取结果,返回. 这个不难. 关键是实际需求中,有很多api返回的数据很复杂,比如渲染地图的接口,一般一条SQL搞不定. 那我就想,那我能不能实现api的拼装呢,你看到我只是调用了一个API,但是我给你返回的结果,其实是

  • Java实现简单的递归操作方法实例

    前言 在数据结构算法设计中,或者一个方法的具体实现的时候,有一种方法叫做"递归",这种方法在思想上并不是特别难,但是实现起来还是有一些需要注意的.虽然对于很多递归算法都可以由相应的循环迭代来代替,但是对于一些比较抽象复杂的算法不用递归很难理解与实现. 递归分为直接递归和间接递归,就简单分享一下两个小的直接递归. 对于递归的概念,其实你可以简单的理解为自己定义自己,记得小时候看过一部电视剧<狼毒花>,里面主角叫做"常发",但是个文盲,老师问他叫什么,他说&

  • Java方法递归调用实例解析

    这篇文章主要介绍了Java方法递归调用实例解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 /* 关于方法的递归调用 1.什么是递归? -方法自身调用自身 a(){ a(){ } } 2.递归是很耗费栈内存的,递归算法可以不用的时候尽量不用 3.一下程序运行的时候发生了这样一个错误[不是异常,是错误Error]: java.lang.StackOverflowErroe 栈内存溢出错误. 错误放生无法挽回,只有一个结果,就是JVM停止工作 4

  • java如何用递归方法求阶乘

    java 用递归方法求阶乘 一个正整数的阶乘,是所有不大于该数的正整数的积,并且0的阶乘为1,n的阶乘写作n!,由1808年基斯顿·卡曼(Christian Kramp,1760-1826)引进这个表示法. java代码: //用递归方法求阶乘 public class Factorial{ public static void main(String[] args){ int N = 5; for(int n = 0; n <= N; n++){ int fact = factorial(n)

  • java中方法递归的简单示例

    一.递归的思路 一个方法在执行时,调用自身被称为"递归". 递归相当于数学归纳法,有一个起始条件,有一个递推公式. 递归可以分为:单路递归和多路递归(如二叉树和斐波那契数列). 二.代码举例 1.n的阶乘 //n的阶乘 public static int fac(int num){ if(num == 1){ return 1; } return num * fac(num-1); } public static void main(String[] args) { int n = 5

  • Java中的递归方法示例介绍

    目录 递归 递归的注意事项: 案例一 递归求阶乘 不使用递归实现阶乘 使用递归实现阶乘 澳大利亚不死神兔(斐波那契数列) 使用数组实现 使用递归实现 总结 递归 方法定义本身调用方法本身的现象叫做递归 在这之前我们学的东西:例如StringBuffer.append().append().append()这个不叫递归.这个叫方法的连续调用Math.max(Math.max(a,b),c)也不是递归,那这些是什么呢?这些是方法的调用. 那什么是递归呢? 举例: 从前有座山,山里有座庙,庙里有个老和

  • Java 精炼解读递归的概念与使用

    目录 一.递归的概念 1.什么是递归? 2.递归讲解 二.递归的使用  总结: 一.递归的概念 1.什么是递归? 递归就是:方法自己调用方法的过程. 使用递归有两个前提条件: 1.有一个趋近与终止的条件. 2.自己调用自己 . 如何实现递归? 最重要的方式是:实现递归,需要去推导出一个递推公式. 思考递归的方式:横向思考,根据递推公式来思考. 代码的执行:是纵向执行. 2.递归讲解 首先看下面代码: public class TestDemo { public static void func(

  • Java 精炼解读数据结构的链表的概念与实现

    目录 前言: 一.什么是链表 链表的概念 链表的结构 链表如何存储数据 链表的实现   穷举法创建链表 打印链表 查找是否包含关键字key是否在单链表当中  得到单链表的长度: 头插法 尾插法 任意位置插入,第一个数据节点为0号下标 删除第一次出现关键字为key的节点 删除所有值为key的节点 总结: 前言: 顺序表的问题及思考 1. 顺序表中间/头部的插入删除,时间复杂度为O(N) 2. 增容需要申请新空间,拷贝数据,释放旧空间.会有不小的消耗. 3. 增容一般是呈2倍的增长,势必会有一定的空

  • Java 精炼解读时间复杂度与空间复杂度

    目录 前言: 一.算法效率 二.时间复杂度 1.时间复杂度概念 2.大O的渐进表示法 计算时间复杂度 三.空间复杂度 总结: 前言: 所谓的复杂度就是衡量算法的效率,衡量算发效率又分为两种,一种叫做时间复杂度,一种叫做空间复杂度. 一.算法效率 算法效率分析分为两种:第一种是时间效率,第二种是空间效率.时间效率被称为时间复杂度,而空间效率被 称作空间复杂度. 时间复杂度主要衡量的是一个算法的运行速度,而空间复杂度主要衡量一个算法所需要的额 外空间,在计算机发展的早期,计算机的存储容量很小.所以对

  • Java 精炼解读数据结构的顺序表如何操作

    目录 前言 一.什么是顺序表 顺序表的概念及结构 创建顺序表 获取顺序表长度 在pos位置新增元素 判定是否包含某个元素 查找某个元素对应的位置 获取pos位置的元素 给pos位置的元素设为value 删除你想要删除的元素 总结: 前言 线性表(linear list)是n个具有相同特性的数据元素的有限序列. 线性表是一种在实际中广泛使用的数据结构,常见 的线性表:顺序表.链表.栈.队列.字符串... 线性表在逻辑上是线性结构,也就说是连续的一条直线.但是在物理结构上并不一定是连续的,线性表在物

  • Java 精炼解读类和对象原理

    面向对象.面向过程 什么是类? 什么是对象? 这是非常抽象的两个概念!!!!!!!! 在说清楚类和对象的概念之前,给大家讲一下什么是面向对象.面向过程,以此来推出我们类和对象的概念. 面向过程:以洗衣服为例:拿盆.放水.放衣服.放洗衣粉.手搓.换水.拧干.晾衣服,这个过程就是面向过程.  面向对象:以洗衣服为例:人把衣服放进洗衣机,倒入洗衣粉,洗完晾干,不需要关心洗衣服整个过程是怎么完成的,只需要找对象,创建对象,使用对象.在好比我们使用toString函数,我们并不关心toString函数具体

  • Java 精炼解读方法的定义与使用

    目录 一.方法的基本用法 1.1什么是方法(method) 1.2方法定义语法  1.3方法的开辟  二.方法的重载  三.方法的使用  一.方法的基本用法 1.1 什么是方法(method) 方法就是一个代码片段. 类似于 C 语言中的 "函数".方法可以把它理解为一个功能,这个功能是可以重复使用的. 1.2 方法定义语法  目前来说写任何方法的时候都写成: pubiic static 返回值 返回名称(形式参数列表){ 函数体/方法体 } 代码举例:求1-n的和 /** * 求我们

  • Java 精炼解读数据结构逻辑控制

    目录 一.顺序结构 二.分支结构 switch语句  三.循环结构 3.1while循环  3.2break 3.3continue  3.4for循环  3.5dowhile循环(选学)  总结: 一.顺序结构 程序的执行和代码的执行顺序有关,如果调整代码的书写顺序, 则执行顺序也发生变化 二.分支结构 基本语法形式1: if(布尔表达式){     //条件满足时执行代码 } 基本语法形式2 if(布尔表达式){     //条件满足时执行代码 }else{     //条件不满足时执行代码

  • 详解Java中二叉树的基础概念(递归&迭代)

    目录 1.树型结构 1.1概念 1.2概念(重要) 2.二叉树(重点) 2.1概念 2.2二叉树的基本形态 2.3两种特殊的二叉树 2.4二叉树的性质 2.5二叉树的存储 2.6二叉树的基本操作 2.7二叉树的层序遍历 3.二叉树完整代码 1. 树型结构 1.1概念 树是一种 非线性 的数据结构,它是由 n ( n>=0 )个有限结点组成一个具有层次关系的集合. 把它叫做树是因为它看 起来像一棵倒挂的树,也就是说它是根朝上,而叶朝下的 . 1.2 概念(重要) a.节点的度:该节点子树的个数:如

  • java数据结构之树基本概念解析及代码示例

    Java中树的存储结构实现 一.树 树与线性表.栈.队列等线性结构不同,树是一...节点与节点之间的父子关系,可以为每个节点增加一个parent域,用以记录该节点的父点 树是一种抽象数据类型(ADT)或是实作这种抽象数据类型的数据结构,用来模拟具有树状结构性质的数据集合.它是由n(n>0)个有限节点组成一个具有层次关系的集合.把 它叫做"树"是因为它看起来像一棵倒挂的树,也就是说它是根朝上,而叶朝下的. 树定义和基本术语 定义 树(Tree)是n(n≥0)个结点的有限集T,并且当

  • Java中关于二叉树的概念以及搜索二叉树详解

    目录 一.二叉树的概念 为什么要使用二叉树? 树是什么? 树的相关术语! 根节点 路径 父节点 子节点 叶节点 子树 访问 层(深度) 关键字 满二叉树 完全二叉树 二叉树的五大性质 二.搜索二叉树 插入 删除 hello, everyone. Long time no see. 本期文章,我们主要讲解一下二叉树的相关概念,顺便也把搜索二叉树(也叫二叉排序树)讲一下.我们直接进入正题吧!GitHub源码链接 一.二叉树的概念 为什么要使用二叉树? 为什么要用到树呢?因为它通常结合了另外两种数据结

随机推荐