【算法】递归的概念、基本思想

创作不易,本篇文章如果帮助到了你,还请点赞 关注支持一下♡>𖥦<)!!

主页专栏有更多知识,如有疑问欢迎大家指正讨论,共同进步!

🔥c++系列专栏:C/C++零基础到精通 🔥

给大家跳段街舞感谢支持!ጿ ኈ ቼ ዽ ጿ ኈ ቼ ዽ ጿ ኈ ቼ ዽ ጿ ኈ ቼ ዽ ጿ ኈ ቼ

c语言内容💖:

专栏:c语言之路重点知识整合

【c语言】全部知识点总结


目录

一、递归的概念

递归(Recursion):是一个函数在其定义中直接或间接调用自身的一种方法。直接或间接地调用自身的算法称为递归算法。用函数自身给出定义的函数称为递归函数

递归算法通过函数调用自身将问题转化为本质相同但规模较小的子问题,是分治策略的具体体现

递归需要有递归出口递归关系式

  • 递归出口:边界条件,停止递归,问题规模足够小,直可以接给出答案
  • 递归关系式:分解原问题为更小规模但解决方法与原问题一样的子问题

1)例:阶乘

cpp 复制代码
int factorial(int n)
{
    if (n == 0) return 1; 		//递归出口
    return n * factorial(n − 1);    //递归关系式
}

阶乘函数可递归地定义为:

边界条件递归方程是递归函数的两个要素,递归函数只有具备了这两个要素,才能在有限次计算后得出结果

总结枚举设计的递归函数的基本框架: 当问题规模小到可以直接解决

cpp 复制代码
type method(数据)
{
   if(问题规模足够小)
   {
       输出结果;  	 //递归出口
   }
   else{
       分解问题为更小规模的子问题;   //递归关系式
   }
  }

2)例:斐波那契数列

无穷数列1,1,2,3,5,8,13,21,34,55,......,称为Fibonacci数列。它可以递归地定义为:

cpp 复制代码
int Fibonacci(int n)
{
    if (n <= 1) 
        return 1;
    return Fibonacci(n-1)+Fibonacci(n-2);
}

3)例:汉诺塔问题

汉诺塔(Tower of Hanoi),又称河内塔,是一个源于印度古老传说的益智玩具。大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘。

见文章:【c语言习题】函数递归调用实现汉诺塔

二、递归中的栈

递归函数被调用时,系统需要一个运行工作栈。系统的运行工作栈要保存两类信息:

  • 调用函数的返回地址
  • 调用函数的局部变量值

先调用后返回!

每一层递归调用所需保存的信息构成运行工作栈的一个工作记录,在每进入下一层递归调用时,系统就建立一个新的工作记录,并把这个工作记录进栈。

每返回一层递归调用,就出栈一个工作记录。

因为栈顶的工作记录必定是当前正在运行的递归函数的工作记录,所以栈顶的工作记录也称为活动记录。

三、递归的基本思想

递归是将一个问题分解成多个与原问题相似但规模更小的问题来解决,直到问题的规模变得足够小,可以直接求解。

每个小问题解决之后,将子问题的解合并起来,最终得到原问题的解。


递归分为两个步骤:递推、回归

  • 在递推阶段,问题被分解成规模更小的子问题,并递归地求解这些子问题。
  • 在回归阶段,子问题的解将被合并为原问题的解。

递归总结

  • 递归的结构清晰,可读性强
  • 递归算法的运行效率较低,占用存储空间大,递归深度过深可能导致栈溢出
  • 被调用的局部变量需要分配存储区,保存计算结果

|--------------------------------------|
| 大家的点赞、收藏、关注将是我更新的最大动力! 欢迎留言或私信建议或问题。 |

|---------------------------------------------------------------|
| 大家的支持和反馈对我来说意义重大,我会继续不断努力提供有价值的内容!如果本文哪里有错误的地方还请大家多多指出(●'◡'●) |

相关推荐
KingRumn2 小时前
Linux信号之标准信号与实时信号
linux·算法
沐知全栈开发4 小时前
HTML5 浏览器支持
开发语言
wasp5204 小时前
AgentScope Java 核心架构深度解析
java·开发语言·人工智能·架构·agentscope
WHOVENLY5 小时前
【javaScript】- 笔试题合集(长期更新,建议收藏,目前已更新至31题)
开发语言·前端·javascript
QT 小鲜肉5 小时前
【Linux命令大全】001.文件管理之git命令(实操篇)
linux·服务器·笔记·git·elasticsearch
慌糖5 小时前
流-为序列化解释
开发语言
半夏知半秋5 小时前
docker常用指令整理
运维·笔记·后端·学习·docker·容器
LXS_3575 小时前
Day 18 C++提高 之 STL常用容器(string、vector、deque)
开发语言·c++·笔记·学习方法·改行学it
蒸蒸yyyyzwd5 小时前
网络编程——threadpool.h学习笔记
笔记·学习