递归的优点和缺点

栈的大小是固定的,这也就意味着不能无限的递归。递归到某些时候,栈顶将会没有更多空间

来添加新的栈顶—就好像橱柜的空间被挤满,不能增加一个盘子一样

复制代码
void recurse()
{
    recurse(); //函数调用其自身
}
int main()
{
    recurse();//开始递归
}
//最终 栈空间会消耗一空,程序将因栈溢出而崩溃
复制代码

函数相互递归,以阶乘为例:

复制代码
int factorial_odd (int x)
{
    if(x == 0)
    {
        return  1;
    }
    return factorial_even(x-1);
}

int factorial_even(int x)
{
    if(x == 0)
    {
        return 1;
    }
    return factorial(x-1);
}
int factorial(int x)
{
    if(x%2==0)
    {
        return factorial_even(x);
    }
    else
    {
        return factorial_odd(x);
    }
}
//基线条件没有防负数输入 ,即使调用factorial(-1)会导致这样的
//调用栈 factorial(-1000))
复制代码

递归需要做许多函数调用,每个函数调用都需要设置有一个栈帧,并传递参数,这些都增加了时间开销,而这些开销循环中没有。绝大多数情况下,现代计算机

中这些开销影响并不显著。但如果你的代码频繁执行(比如短时间内执行百万次甚至上亿次),你必须关注函数调用性能的问题

递归比循环更加强大的地方在于,递归函数维持着一个保存每次递归调用当前状态的栈,允许函数获得子问题的结果后继续处理。

递归算法:将问题分解成更小的版本的相同问题,从而解决问题。

posted @   woaijava  阅读(4698)  评论(0编辑  收藏  举报
编辑推荐:
· Linux glibc自带哈希表的用例及性能测试
· 深入理解 Mybatis 分库分表执行原理
· 如何打造一个高并发系统?
· .NET Core GC压缩(compact_phase)底层原理浅谈
· 现代计算机视觉入门之:什么是图片特征编码
阅读排行:
· 手把手教你在本地部署DeepSeek R1,搭建web-ui ,建议收藏!
· Spring AI + Ollama 实现 deepseek-r1 的API服务和调用
· 数据库服务器 SQL Server 版本升级公告
· 程序员常用高效实用工具推荐,办公效率提升利器!
· C#/.NET/.NET Core技术前沿周刊 | 第 23 期(2025年1.20-1.26)
点击右上角即可分享
微信分享提示