C为什么斐波那契数列递归50不会栈溢出

2023-11-15

今天看了个文章,是说递归的。

大概代码如下:

void test(int n){
    if (n<1000000)
    {
        test(n+1);
    }
}

int main()
{
    test(1);
    return 0;
}

运行报错:Stack overflow 堆栈溢出。

为什么会溢出内,因为在内存开辟的一块栈的空间是有限的(具体内存开辟了多少,如何开辟还在研究);

然后程序执时会将函数压入栈内,程序没有返回或结束时,不会从栈内弹出来,也就是说会压入栈内1000000次函数执行体。这样就撑爆了栈,所以会报错。

回到题目:

为什么斐波那契递归第50项,要计算2^49次方,不会栈溢出呢?

用计算器计算一下2^49次方等于:1125899906842624,这么多次栈没有溢出。

而开始的 1000000 次就溢出的?

为什么?

递归斐波那契第50项的值,就要知道49和48的值相加。

递归斐波那契第49项的值,就要知道48和47的值相加。

递归斐波那契第48项的值,就要知道47和46的值相加。

.......

                                        50                                2^0
                         49             +             48                  2^1
                     48  +  47                    47  +  46               2^2
                     ......                       ......                  2^n
                                                                      最后2^49

那么他是这样层序遍历的吗?

不是,他是通过前序遍历,即:

求第50项的斐波那契数:

Fei(50-1) + Fei(50-2),当执行到Fei(50-1)时,又进入递归了(Fei(50-2)没来得及执行呢),就是走到了上图左子树49的位置,

 Fei(49-1) + Fei(49-2),当执行到Fei(49-1)时,又进入递归(Fei(49-2)没来得及执行呢),就是走到了上图左子树48的位置,

 Fei(48-1) + Fei(48-2),当执行到Fei(48-1)时,又进入递归(Fei(48-2)没来得及执行呢),就是走到了上图左子树47的位置(上图写的....没都写出来)

.....

直到最后

 Fei(2-1) + Fei(2-2),当执行到Fei(2-1)时,又进入递归(Fei(2-2)没来得及执行呢),就是走到了上图左子树1的位置,

然后条件成立了,就返回了1。这时就开始回溯了,回溯的同时就是出栈了,释放栈。

所以左子树遍历40次就释放栈了。不会将几千万都压入栈中再释放的。

所以就不会栈溢出了!

如果没懂就留言吧。后期博客再完善一下,配图或动画详细讲解。这都是手写的过程,不那么明确!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C为什么斐波那契数列递归50不会栈溢出 的相关文章

  • InvalidOperationException - 对象当前正在其他地方使用 - 红十字

    我有一个 C 桌面应用程序 其中我连续创建的一个线程从源 实际上是一台数码相机 获取图像并将其放在 GUI 中的面板 panel Image img 上 这必须是另一个线程 如它是控件的代码隐藏 该应用程序可以工作 但在某些机器上 我会在随
  • 每个托管线程是否都有自己对应的本机线程?

    我想知道是否在 Net 中创建托管线程 通过调用Thread Start 导致在后台创建一个本机线程 那么托管线程是否有对应的本机线程呢 如果是 当托管线程等待或睡眠时 是否意味着相应的本机线程也在等待或睡眠 是的 NET 线程映射到所有当
  • 未提供参数时如何指定 C# System.Commandline 行为?

    在我的控制台应用程序中 当未提供控制台参数时 将执行我指定列表 在本例中为参数 3 的任何处理程序 调用该处理程序时 布尔参数设置为 false 但对我来说 根本不调用它更有意义 如何防止这种情况发生并显示帮助文本 using System
  • 确保 StreamReader 不会挂起等待数据

    下面的代码读取从 tcp 客户端流读取的所有内容 并且在下一次迭代中它将仅位于 Read 上 我假设正在等待数据 我如何确保它不会在没有任何内容可供读取时返回 我是否必须设置低超时 并在失败时响应异常 或者有更好的办法吗 TcpClient
  • 提交后禁用按钮

    当用户提交付款表单并且发布表单的代码导致 Firefox 中出现重复发布时 我试图禁用按钮 去掉代码就不会出现这个问题 在firefox以外的任何浏览器中也不会出现这个问题 知道如何防止双重帖子吗 System Text StringBui
  • 在 DataView 的 RowFilter 中选择 DISTINCT

    我试图根据与另一个表的关系缩小 DataView 中的行范围 我使用的 RowFilter 如下 dv new DataView myDS myTable id IN SELECT DISTINCT parentID FROM myOthe
  • 在 LINQ 中按 Id 连接多表和分组

    我想按categoryId显示列表产品的名称组 这是我的代码 我想要我的视图显示结果 Desktop PC HP Red PC Dell Yellow PC Asus Red SmartPhone Lumia 720 Blue 我的组模型
  • java.io.Serialized 在 C/C++ 中的等价物是什么?

    C C 的等价物是什么java io Serialized https docs oracle com javase 7 docs api java io Serializable html 有对序列化库的引用 用 C 序列化数据结构 ht
  • 将 Word 文档另存为图像

    我正在使用下面的代码将 Word 文档转换为图像文件 但是图片显得太大 内容不适合 有没有办法渲染图片或将图片保存到合适的尺寸 private void btnConvert Click object sender EventArgs e
  • 具有交替类型的可变参数模板参数包

    我想知道是否可以使用参数包捕获交替参数模式 例如 template
  • 使用自定义堆的类似 malloc 的函数

    如果我希望使用自定义预分配堆构造类似 malloc 的功能 那么 C 中最好的方法是什么 我的具体问题是 我有一个可映射 类似内存 的设备 已将其放入我的地址空间中 但我需要获得一种更灵活的方式来使用该内存来存储将随着时间的推移分配和释放的
  • 外键与独立关系 - Entity Framework 5 有改进吗?

    我读过了several http www ladislavmrnka com 2011 05 foreign key vs independent associations in ef 4 文章和问题 https stackoverflow
  • 等待进程释放文件

    我如何等待文件空闲以便ss Save 可以用新的覆盖它吗 如果我紧密地运行两次 左右 我会得到一个generic GDI error
  • AES 128 CBC 蒙特卡罗测试

    我正在 AES 128 CBC 上执行 MCT 如中所述http csrc nist gov groups STM cavp documents aes AESAVS pdf http csrc nist gov groups STM ca
  • “接口”类似于 boost::bind 的语义

    我希望能够将 Java 的接口语义与 C 结合起来 起初 我用过boost signal为给定事件回调显式注册的成员函数 这非常有效 但后来我发现一些函数回调池是相关的 因此将它们抽象出来并立即注册所有实例的相关回调是有意义的 但我了解到的
  • 如果没有抽象成员,基类是否应该标记为抽象?

    如果一个类没有抽象成员 可以将其标记为抽象吗 即使没有实际理由直接实例化它 除了单元测试 是的 将不应该实例化的基类显式标记为抽象是合理且有益的 即使在没有抽象方法的情况下也是如此 它强制执行通用准则来使非叶类抽象 它阻止其他程序员创建该类
  • 方法优化 - C#

    我开发了一种方法 允许我通过参数传入表 字符串 列数组 字符串 和值数组 对象 然后使用这些参数创建参数化查询 虽然它工作得很好 但代码的长度以及多个 for 循环散发出一种代码味道 特别是我觉得我用来在列和值之间插入逗号的方法可以用不同的
  • System.IO.FileNotFoundException:找不到网络路径。在 Windows 7 上使用 DirectoryEntry 对象时出现异常

    我正在尝试使用 DirectoryEntry 对象连接到远程 Windows 7 计算机 这是我的代码 DirectoryEntry obDirEntry new DirectoryEntry WinNT hostName hostName
  • 当从finally中抛出异常时,Catch块不会被评估

    出现这个问题的原因是之前在 NET 4 0 中运行的代码在 NET 4 5 中因未处理的异常而失败 部分原因是 try finallys 如果您想了解详细信息 请阅读更多内容微软连接 https connect microsoft com
  • 从列表中选择项目以求和

    我有一个包含数值的项目列表 我需要使用这些项目求和 我需要你的帮助来构建这样的算法 下面是一个用 C 编写的示例 描述了我的问题 int sum 21 List

随机推荐

  • 分组对列扁平化(列转换行 关系型转换NoSQL)

    前言 关系型数据库要符合第一范式即原子性 因此字段多值情况只能分行处理 如下表 假设keys是terms appl dt 则no predict pay dt actual pay dt 是多值 如果要转换成NoSQL或collection
  • 连续七天登录-在线人数最多

    连续七天登录 select id count from select date add dated rown as startdate from select row number over PARTITION by id order by
  • 随笔篇-多线程世界的来龙去脉

    文章目录 线程 多线程带来的问题 线程的挂起与唤醒 线程的管理 如果看官觉得有点用 点赞一下 鼓励一下我吧 感谢原创的整理 以下是原文作者连接 原文 https zhuanlan zhihu com p 122010626 以下为摘抄概要整
  • JSP数据交互(二)----》浏览器缓存cookie

    学会使用浏览器缓存cookie 生活中的cookie 系统会记录已经浏览过的搜索记录 cookie是Web服务器保存在客户端的一系列文本信息 cook的作用 对特定的对象追踪 实现各种个性化功能 简化登录 安全性能 容易泄露信息 在JSP中
  • Latex 操作(3) beamer(PPT)

    1 新建文件 documentclass 11pt beamer 11pt 是设置的字号大小 usetheme CambridgeUS 排版主题Madrid 在每个section前有一个current显示 放到引言区 在每个section前
  • QT 按键组 - QButtonGroup

    链接 https blog csdn net potato123232 article details 118788209 ops request misc 257B 2522request 255Fid 2522 253A 2522167
  • 无人飞行器智能感知竞赛--模拟器安装

    开发环境 win11 wsl2 注意事项 请配合视频使用 如果不看视频会对下面的配置过程迷惑 因为一开始我是想安装在ubuntu18 04的 中途发现ubuntu18 04没有ros noetic 所以转入ubuntu20 04配置 视频链
  • 过年宅家,学习wxPython,编了个数回(Slither Link)小游戏,踩了好多坑,特记一下

    今年过年真是前所未有的有时间 哪都去不了 于是难得得有时间想学习一下 好多年没编程 没写博客 因为总是编嵌入式的c程序 对界面开发基本没搞过 过去只会用Borland C 还是6 0 真是太过时了 好在还学过python 听说用python
  • gcc编译程序的四个阶段(预处理-编译-汇编-链接)

    相关博客http blog csdn net eastonwoo article details 8655243 相关博客http blog sina com cn s blog 5ff8e88e01015tga html gcc的编译流程
  • 【实战】基于GDAL库读取指定经纬度下的地表覆盖数据(数据源:清华大学FROM_GLC10(2017))

    目录 前言 数据源 清华大学宫鹏教授学科组10m土地覆盖数据 数据集类型 下载途径 GDAL库读取FROM GLC10数据集 下载一个GIS平台 数据集命名规则 GetGeoTransfrom方法介绍 实例代码 geoTransform参数
  • R读取csv格式文件;result <- read.table;及报错

    设置文件目录 读取数据csv csv的分隔符 注意表格中不能有逗号 一般仅要设施以下参数 result lt read table file header TRUE sep stringsAsFactors FALSE setwd C Us
  • dll文件保存到服务器,dll是什么文件?dll文件怎么打开?

    dll是Dynamic Link Library的简称 意为动态链接库 dll文件一般被储放在C WindowsSystem目录下 在Windows中 很多应用软件并并不是一个详细的可实行文件 他们被切分成一些相对性单独的动态链接库 即dl
  • SuperSocket使用 IRequestInfo 和 IReceiveFilter 等对象实现自定义协议

    本文章向大家介绍SuperSocket使用 IRequestInfo 和 IReceiveFilter 等对象实现自定义协议 主要包括SuperSocket使用 IRequestInfo 和 IReceiveFilter 等对象实现自定义协
  • 常见性能测试指标

    性能测试核心指标 吞吐量 响应时间 Rsponse Time 并发处理能力 资源占用能力 测试中的时间占比 40 性能测试分析 30 测试执行 30 测试结果分析 而全链路监控就是只要和系统相关的全部需要监控到 吞吐量 单位时间内 系统能够
  • 红黑树与AVL树的区别

    文章目录 红黑树与AVL树的区别 红黑树的一个案列 英文答案 红黑树的高度问题 红黑树的优点 与AVL树的比较 相同点 使用 红黑树为何能比AVL树高效的原因 分析 红黑树的应用领域 java 集合类和c STL Linux 选择RBTre
  • Microsoft Store无法打开解决方法

    Microsoft Store 无法启动 网络出错问题解决 Microsoft Store 无法启动 一直在转圈 最后显示网络出错的问题 解决方法 1 通过搜索打开 gt 控制面板 2 打开 gt 网络和Internet 3 打开 gt I
  • 有道云笔记登录失败,解决办法

    今天登录有道云笔记是 无论是app还是pc端 一直显示登陆失败 摸索了解决方法 先登录网页版官网 网页版肯定可以登录的 https note youdao com 进入账号安全 点击你要登陆的端注销 然后重新登陆 亲测 大功告成
  • VirtualBox 无法选择 64 位的虚拟机

    VirtualBox 无法选择 64 位的虚拟机 问题 解决方案 问题 在Win10 64位机器上安装VirtualBox只显示32bit 没有64bit选项 解决方案 一般是电脑没有把支持虚拟机的选项打开 虚拟化功能被占用 控制面板 程序
  • MYSQL 几种 join

    注意 Oracle数据库支持full join mysql是不支持full join的 但仍然可以同过左外连接 union 右外连接实现 初始化SQL语句 join 建表语句 drop database if exists test cre
  • C为什么斐波那契数列递归50不会栈溢出

    今天看了个文章 是说递归的 大概代码如下 void test int n if n lt 1000000 test n 1 int main test 1 return 0 运行报错 Stack overflow 堆栈溢出 为什么会溢出内