news 2026/4/23 12:14:09

递归三种分类方法

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
递归三种分类方法

文章目录

  • 按调用“路数”分(最常见)
  • 按“谁调用谁”分
  • 按“调用的位置”分(性能优化向)
  • 总结

递归是编程语言中常见的算法技巧,但是递归名称很多,我整理了一下递归常见的三种分类法。

按调用“路数”分(最常见)

这是根据一个函数在递归时,会派生出几个“分身”来分类的。

A. 线性递归 (Linear Recursion)

  • 特点:函数在递归阶段,只调用一次自己。
  • 长相
voidlinear(int n){if(n<=0)return;// 只调用一次自己linear(n-1);}
  • 理解:这就像是一个单向链表,或者一根绳子,一头拉着一头,直到拉断(触底反弹)。
  • 例子:计算阶乘、遍历单链表。
  • 优化:这种递归可以直接改成循环!

B. 树形递归 (Tree Recursion)
*特点:函数在递归阶段,调用了多次(通常是两次或以上)自己。
*长相

voidtree(int n){if(n<=1)return;// 调用两次自己,这就分叉了!tree(n-1);tree(n-2);}
  • 理解:这就像是二叉树的遍历,每走一步就分两叉,呈指数级爆炸增长。
  • 例子:斐波那契数列(朴素写法)、二叉树遍历。
  • 优化:这种递归有两种优化方案,使用显式栈(避免系统栈溢出)和记忆化搜索(加缓存)。但是要视情况而定:显式栈代码复杂;而多线程环境里的fork/join用的树形递归往往是拆分数据集,几乎没有重复的入参,加缓存没有用。

按“谁调用谁”分

这是根据函数调用的“人际关系”来分类的。

A. 直接递归 (Direct Recursion)

  • 特点:函数A直接调用自己(A)
  • 长相
voidA(){// ...A();// 我直接call我自己}
  • 备注:这是我们最最常用的递归方式。

B. 间接递归 (Indirect Recursion)

  • 特点:函数A调用函数B,函数B又反过来调用函数A
  • 长相
voidA(){// ...B();// 我让兄弟帮我干}voidB(){// ...A();// 兄弟又把活扔回给我}
  • 理解:这就像是两个人互相踢皮球,直到把球踢烂(栈溢出)或者达成条件停止。

按“调用的位置”分(性能优化向)

这是你提到的尾递归所在的分类,也是性能优化的关键。

A. 头递归 (Head Recursion)

  • 特点:先递归调用,拿到结果后,进行计算(或者说,递归调用在函数体的前面)。
  • 长相
inthead(int n){if(n==0)return0;// 先递归下去,等回来之后,还要做 +n 的操作returnhead(n-1)+n;}
  • 缺点:必须把每一层的现场(比如这里的 n)都保存在栈里,等着“归”的时候用。容易栈溢出。

B. 尾递归 (Tail Recursion) —— 你提到的那位

  • 特点:递归调用是函数的最后一步操作。调用之后,函数不需要再做任何计算了,直接返回结果就行。
  • 长相
inttail(int n,int acc){if(n==0)returnacc;// 计算已经在参数里做完了(acc + n),这里只是单纯的跳转returntail(n-1,acc+n);}
  • 优点:编译器可以进行尾调用优化 (TCO)。它不需要保留上一层的栈帧,直接把当前栈覆盖掉就行。这样,无论递归多少层,栈空间永远是 O(1) 的,不会栈溢出。

总结

分类维度类型关键特征
调用路数线性递归一层只调一次自己
树形递归一层调多次自己
调用关系直接递归自己调自己
间接递归你调我,我调你
调用位置头递归调完还要算
尾递归调完直接返
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/22 4:21:06

FFXIV TexTools:重塑艾欧泽亚视觉体验的创意引擎

FFXIV TexTools&#xff1a;重塑艾欧泽亚视觉体验的创意引擎 【免费下载链接】FFXIV_TexTools_UI 项目地址: https://gitcode.com/gh_mirrors/ff/FFXIV_TexTools_UI 从工具到创作平台的进化 FFXIV TexTools不仅是一个简单的模组管理器&#xff0c;更是连接《最终幻想1…

作者头像 李华
网站建设 2026/4/21 20:29:09

DBCHM数据库文档生成工具:轻松管理你的数据结构

还在为数据库文档的编写而烦恼吗&#xff1f;DBCHM这款工具能够帮助你快速生成专业的数据库字典文档&#xff0c;支持多种格式输出和灵活的分组管理。无论你是开发新手还是资深工程师&#xff0c;都能从中受益。 【免费下载链接】DBCHM DBCHM修改版本&#xff0c;支持导出数据库…

作者头像 李华
网站建设 2026/4/15 22:20:00

Mac窗口置顶终极指南:用Topit轻松实现多任务效率革命

Mac窗口置顶终极指南&#xff1a;用Topit轻松实现多任务效率革命 【免费下载链接】Topit Pin any window to the top of your screen / 在Mac上将你的任何窗口强制置顶 项目地址: https://gitcode.com/gh_mirrors/to/Topit 在当今多任务工作环境中&#xff0c;窗口管理效…

作者头像 李华
网站建设 2026/4/18 3:49:44

HSTracker:macOS炉石传说玩家的智能数据助手

还在为记不住对手卡组而烦恼吗&#xff1f;每次对战都感觉在"盲打"&#xff1f;这款专为macOS设计的炉石传说辅助工具&#xff0c;将彻底改变你的游戏体验&#xff01;HSTracker作为一款专业的卡组数据工具和管理器&#xff0c;能够实时显示对战数据&#xff0c;帮助…

作者头像 李华
网站建设 2026/4/15 19:44:19

AcFunDown:零基础轻松上手,A站视频下载完整教程

AcFunDown&#xff1a;零基础轻松上手&#xff0c;A站视频下载完整教程 【免费下载链接】AcFunDown 包含PC端UI界面的A站 视频下载器。支持收藏夹、UP主视频批量下载 &#x1f633;仅供交流学习使用喔 项目地址: https://gitcode.com/gh_mirrors/ac/AcFunDown 还在为无法…

作者头像 李华
网站建设 2026/4/23 11:13:14

3分钟掌握Umi-OCR:免费离线文字识别的终极使用指南

3分钟掌握Umi-OCR&#xff1a;免费离线文字识别的终极使用指南 【免费下载链接】Umi-OCR Umi-OCR: 这是一个免费、开源、可批量处理的离线OCR软件&#xff0c;适用于Windows系统&#xff0c;支持截图OCR、批量OCR、二维码识别等功能。 项目地址: https://gitcode.com/GitHub_…

作者头像 李华