数据结构【八】- 递归【一】递归的本质/ 递归的宏观语意/ 写递归算法的基本原则/ 递归函数的“微观”解读

本文主要是介绍数据结构【八】- 递归【一】递归的本质/ 递归的宏观语意/ 写递归算法的基本原则/ 递归函数的“微观”解读,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一。递归的本质

            本质上,递归就是将原来的问题,转化为更小的同一问题。

二。递归的举例

更多链表问题搜索:LinkedListProblems.pdf

(一)例子

          用递归来写数组求和

(二)思路

1. 对一个数组求和就等于:将【数组总和】=【数组的第0个数】+【数组中从1索引到...n-1这个索引的和】。

  • 这个时候,Sum(arr[1....n-1])要解决的问题就要比Sum(arr[0....n-1]要解决的问题更小。==> 这就是更小的同一问题。
  • 为什么更小?==> 因为Sum(arr[1....n-1])少了一个元素,只需要对n-1个元素求和。

     

2. 以此类推:【Sum(arr[1....n-1])】= 【索引为1的元素】+【数组中从2索引到...n-1这个索引的和】

     

3. 直到在最后的时候,我们这个问题缩小到:【Sum(arr[n-1....n-1])】=【索引为n-1的元素】+【空数组】

【空数组】的和为0,至此我们得到了一个基本的问题

    

(三)数组求和代码

public class ArraySum {public static int sum(int[] arr){return sum(arr,0);}//计算arr[l...n]这个区间内所有数字的和private static int sum(int[] arr, int l){//基本问题:当l==arr.length的时候,也就是数组为空if (l == arr.length){return 0;}return arr[l]+sum(arr, l+1);}
}

(四)代码测试 

    public static void main(String[] args){int[] nums = {1,2,3,4,5,6,7,8};System.err.println(sum(nums));}

36

(四)递归函数的“微观”解读

  • 递归函数的调用,本质就是函数调用。

1. 递归调用方法

       对于数据arr = [6,10] ,我们用sum()方法求它的总和。

       

2. 递归运行过程:

    我们给数组【arr = [6,10]】来调用方法 sum(arr,0);

第一步:

   l此时等于0,那么我们运行到 【int x = sum(arr,l+1);】的时候,就产生了递归调用。重新调用了一下sum(arr,0+1).

                     

第二步: l此时等于1。调用sum(arr,1),也就是在一个新的sum函数中,重新针对现在的参数走一遍。进入方法sum(arr,1),运行到 【int x = sum(arr,l+1);】的时候2产生了递归调用。重新调用了一下sum(arr,1+1).

               

第三步:l此时等于2。调用sum(arr,2),进入方法sum(arr,2),运行到 【if (l == arr.length) return 0;】的时候,满足这个条件,【return 0】;

       

第四步:此时sum(arr,2)中返回的【0】就返回到上一次在sum(arr,1)这次调用中中断的位置,也就是【int x = sum(arr,l+1);】.

              此时x可以计算出来【x是0】.然后我们可以计算出sum(arr,1)的res的值【res是10+0=10

             

          

 

第五步:此时sum(arr,1)中返回的【10】就返回到上一次在sum(arr,0)这次调用中中断的位置,也就是【int x = sum(arr,l+1);】。

              此此时x可以计算出来【x是10】.然后我们可以计算出sum(arr,0)的res的值【res是6+10=16

              

           

第六步:最后得出sum(arr,0)的结果是16.

       

 

三。写递归算法的基本原则

1. 所有的递归算法都可以分成两部分

  • 求解最基本的问题(最基本的问题是不能自动求解的,是需要我们自己编写逻辑来求解)
  • 核心部分:将原问题转化为更小的问题

       

2. 写递归函数的时候要注重:递归函数的“宏观”语意。站在更高的层次去思考这个函数本身的功能和作用,有利于理解递归的逻辑。

对于【数组求和】来说,我们“宏观”语意就是:计算arr[] 数组的“l”到“n”的索引的和。

对于【删除链表元素】来说,宏观语意就是:对一个链表中删除值为val的节点

3. 不要太注意内部调用。

4. 递归函数的调用,本质就是函数调用。只不过调用的函数是自己而已。

5. 递归调用是有代价的:

函数调用需要更多的时间开销,包括

【1】记录当前函数执行的位置+当前局部变量的状态,

【2】函数调用本身在计算机底层要找到新的函数所在的位置。

更重要的:递归调用消耗系统栈的空间。

【1】例如,当不处理基本问题时,递归将一直进行下去,没有终止,最终产生错误:系统栈被占满.

【2】如果对于数百万的数组用递归算法求和,栈空间不够用。

【3】如果对百万长度的链表递归删除元素,栈空间不够用。

 

 

 

 

 

                                    以上所有内容都是通过"慕课网"听"liuyubobobo"的《玩转数据结构》课程后总结

这篇关于数据结构【八】- 递归【一】递归的本质/ 递归的宏观语意/ 写递归算法的基本原则/ 递归函数的“微观”解读的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/727292

相关文章

解读GC日志中的各项指标用法

《解读GC日志中的各项指标用法》:本文主要介绍GC日志中的各项指标用法,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、基础 GC 日志格式(以 G1 为例)1. Minor GC 日志2. Full GC 日志二、关键指标解析1. GC 类型与触发原因2. 堆

Java设计模式---迭代器模式(Iterator)解读

《Java设计模式---迭代器模式(Iterator)解读》:本文主要介绍Java设计模式---迭代器模式(Iterator),具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,... 目录1、迭代器(Iterator)1.1、结构1.2、常用方法1.3、本质1、解耦集合与遍历逻辑2、统一

Java中的雪花算法Snowflake解析与实践技巧

《Java中的雪花算法Snowflake解析与实践技巧》本文解析了雪花算法的原理、Java实现及生产实践,涵盖ID结构、位运算技巧、时钟回拨处理、WorkerId分配等关键点,并探讨了百度UidGen... 目录一、雪花算法核心原理1.1 算法起源1.2 ID结构详解1.3 核心特性二、Java实现解析2.

Go语言数据库编程GORM 的基本使用详解

《Go语言数据库编程GORM的基本使用详解》GORM是Go语言流行的ORM框架,封装database/sql,支持自动迁移、关联、事务等,提供CRUD、条件查询、钩子函数、日志等功能,简化数据库操作... 目录一、安装与初始化1. 安装 GORM 及数据库驱动2. 建立数据库连接二、定义模型结构体三、自动迁

ModelMapper基本使用和常见场景示例详解

《ModelMapper基本使用和常见场景示例详解》ModelMapper是Java对象映射库,支持自动映射、自定义规则、集合转换及高级配置(如匹配策略、转换器),可集成SpringBoot,减少样板... 目录1. 添加依赖2. 基本用法示例:简单对象映射3. 自定义映射规则4. 集合映射5. 高级配置匹

MySQL之InnoDB存储页的独立表空间解读

《MySQL之InnoDB存储页的独立表空间解读》:本文主要介绍MySQL之InnoDB存储页的独立表空间,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1、背景2、独立表空间【1】表空间大小【2】区【3】组【4】段【5】区的类型【6】XDES Entry区结构【

MySQL主从复制与读写分离的用法解读

《MySQL主从复制与读写分离的用法解读》:本文主要介绍MySQL主从复制与读写分离的用法,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、主从复制mysql主从复制原理实验案例二、读写分离实验案例安装并配置mycat 软件设置mycat读写分离验证mycat读

Python的端到端测试框架SeleniumBase使用解读

《Python的端到端测试框架SeleniumBase使用解读》:本文主要介绍Python的端到端测试框架SeleniumBase使用,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全... 目录SeleniumBase详细介绍及用法指南什么是 SeleniumBase?SeleniumBase

SQL BETWEEN 语句的基本用法详解

《SQLBETWEEN语句的基本用法详解》SQLBETWEEN语句是一个用于在SQL查询中指定查询条件的重要工具,它允许用户指定一个范围,用于筛选符合特定条件的记录,本文将详细介绍BETWEEN语... 目录概述BETWEEN 语句的基本用法BETWEEN 语句的示例示例 1:查询年龄在 20 到 30 岁

mysql中insert into的基本用法和一些示例

《mysql中insertinto的基本用法和一些示例》INSERTINTO用于向MySQL表插入新行,支持单行/多行及部分列插入,下面给大家介绍mysql中insertinto的基本用法和一些示例... 目录基本语法插入单行数据插入多行数据插入部分列的数据插入默认值注意事项在mysql中,INSERT I