黑马程序员 — 递归

本文深入探讨了递归的概念、特点及其与循环的区别,并详细解释了递归的三大条件、操作步骤以及递归函数的特点。同时,介绍了递归在算法设计中的优势与局限,为读者提供了一种高效解决问题的方法论。
-------android培训java培训、期待与您交流! ----------


递归

什么是递归:

一个函数自己直接或间接调用自己(一个函数调用另外 一个函数和他调用自己是一模一样的,都是那三步, 只不过在人看来有点诡异。


一个过程或函数 在其定义或说明中有直接或间接调用自身的一种方法,它通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解,递归策略只需少量的程序就可描述出解题过程所需要的多次重复计算,大大地减少了程序的代码量。递归的能力在于用有限的 语句 来定义对象的 无限集合 。一般来说,递归需要有边界条件、递归前进段和递归返回段。当边界条件不满足时,递归前进;当边界条件满足时,递归返回。
    

    递归满足的三个条件:

  • 递归必须得有一个明确的终止条件
  • 该函数处理的数据规模必须在递减
  • 这个转化必须是可解的。
    

     循环和递归:

理论上循环能解决的,肯定可以转化为递归,但是这个
过程是复杂的数学转化过程,递归能解决不一定能转化
为循环
    
递归:
  • 易于理解
  • 速度慢
  • 存储空间大
循环:
  • 不易于理解
  • 速度快
  • 存储空间小

递归的操作步骤:

调用前

一个函数的运行期间调用另一个函数时,在运行被调用函数之前,系统需要完成3件事情
  1. 将所有的实参、返回地址等信息传递给被调用函数保存;
  2. 被调用函数局部变量分配存储区;
  3. 将控制转移到被调函数的入口。

调用中

  1. 而从被调用函数返回调用函数之前,系统也应完成3件工作:
  2. 保存被调函数的计算结果;
  3. 释放被调函数的数据区;
  4. 依照被调函数保存的返回地址将控制转移到调用函数。当有多个函数构成嵌套调用时,按照后调用先返回的原则。


递归函数的特点

所有递归函数的结构都是类似的。
  1. 函数要直接或间接调用自身。
  2. 要有递归终止条件检查,即递归终止的条件被满足后,则不再调用自身函数。
  3. 如果不满足递归终止的条件,则调用涉及递归调用的表达式。在调用函数自身时,有关终止条件的参数要发生变化,而且需向递归终止的方向变化。


总结:
函数的调用原则和数据结构栈的实现是相一致。也说明函数调用是通过栈实现的。

黑马程序员作为一家知名的IT培训机构,提供了大量高质量的技术学习资源,涵盖多个热门技术方向,如Java、Python、前端、大数据、人工智能等。这些资源通常包括视频教程、配套文档、源码示例以及实战项目,适合不同阶段的学习者。 对于希望查找**黑马程序员官方在线文档和技术资源**的用户,可以通过以下几个途径获取: ### 获取官方文档和学习资源的渠道 1. **黑马程序员官网** - 官方网站(https://www.itheima.com/)提供了完整的课程体系和配套学习资源。用户可以根据自己的技术方向选择对应的学科,如JavaEE、Python、前端与移动开发、大数据等,获取对应的课程大纲、教学视频和配套文档。 - 特别是一些免费公开课和试学课程,通常会附带完整的讲义和代码示例,适合初学者入门。 2. **黑马程序员论坛** - 黑马程序员的社区平台(http://bbs.itheima.com/)是学员和技术爱好者交流的平台。在这里可以找到很多学员分享的学习笔记、项目经验、技术文档以及课程资料。 - 有些老课程的完整资料也会在社区中被分享出来,具有很高的参考价值。 3. **开源项目与Git平台** - 黑马程序员的官方GitHub或GitCode页面上也会发布一些教学项目和学习资源。例如引用中提到的《黑马程序员Linux网络编程学习资料》就在GitCode上提供了项目地址:https://gitcode.com/Premium-Resources/914e6[^1]。 - 这些项目通常包含完整的代码示例、文档说明以及部署指南,适合动手实践。 4. **B站官方账号** - 黑马程序员在B站(https://space.bilibili.com/38603854)上发布了大量免费的教学视频,涵盖从零基础到高级开发的各个阶段。 - 视频简介中通常附带学习资料的获取方式,包括百度网盘链接或官网跳转链接。 5. **百度网盘共享资源** - 一些学习者会将课程资料整理后上传至百度网盘,并通过社区、论坛等方式分享链接。虽然这些资源并非官方直接提供,但内容往往来源于黑马程序员的公开课程。 --- ### 示例:获取Linux网络编程学习资料 以《黑马程序员Linux网络编程学习资料》为例,该资源可以通过GitCode平台访问,内容包括: - 网络编程基础概念 - Socket编程详解 - 高并发服务器设计与实现 - 多线程与异步IO模型 - 实战项目源码分析 这些内容对系统掌握Linux环境下的网络通信开发非常有帮助。 --- ### 示例:Java学习资源 对于Java方向,黑马程序员提供了从基础语法到高级框架的完整学习路径。例如,Java基础、面向对象、集合框架、多线程、JVM原理、Spring Boot、微服务等均有配套的文档和视频资源[^2]。 例如,下面是一个Java中删除目录的示例代码: ```java import java.io.File; public class DeleteFileDemo { public static void main(String[] args) { File file = new File("F:\\heima"); deleteDir(file); } public static void deleteDir(File dir) { File[] files = dir.listFiles(); for (int i = 0; i < files.length; i++) { if (files[i].isDirectory()) { deleteDir(files[i]); } else { System.out.println(files[i].delete()); } } System.out.println(dir.delete()); } } ``` 这段代码展示了如何递归删除一个目录及其子目录下的所有文件和文件夹[^3]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值