数据结构—栈与递归

本文探讨了递归的基本思想,将其与函数调用联系起来,并介绍了递归函数与栈的关系。通过分析递归函数的非递归化和非递归算法的递归化,展示了递归在解决问题中的广泛应用,包括在分治法中的作用。同时,讨论了函数调用栈的原理和栈溢出问题,以及递归在数学函数、数据结构和可递归求解问题中的角色。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.递归的基本思想

  • 所谓递归,就是有去有回。
  • 递归的基本思想,是把规模较大的一个问题,分解成规模较小的多个子问题去解决,而每一个子问题又可以继续拆分成多个更小的子问题。
  • 最重要的一点就是假设子问题已经解决了,现在要基于已经解决的子问题来解决当前问题;或者说,必须先解决子问题,再基于子问题来解决当前问题。
  • 或者可以这么理解:递归解决的是有依赖顺序关系的多个问题。

我们假设一个抽象问题有两个时间点要素:开始处理,结束处理。那么递归处理的顺序就是,先开始处理的问题,最后才能结束处理。
假设如下问题的依赖关系:

  • 【A】----依赖---->【B】----依赖---->【C】
  • 我们的终极目的是要解决问题A,
  • 那么三个问题的处理顺序如下:
  • 开始处理问题A;
  • 由于A依赖B,因此开始处理问题B;
  • 由于B依赖C,开始处理问题C;
  • 结束处理问题C;
  • 结束处理问题B;
  • 结束处理问题A。

2.从函数调用看广义递归

  • 对于软件来说,函数的调用关系就是一个广义递归的过程,如下,
func_A()
{
    func_B();
}
func_B()
{
    func_C();
}
func_C()
{
    /////
}
  • 调用函数A;
  • 调用函数B;
  • 调用函数C;
  • 函数C返回;
  • 函数B返回;
  • 函数A返回;

3.狭义递归函数

  • 有一种特例,就是处理问题A/B/C的方法是一样的,这就是产生了狭义的“递
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值