递归方法的理解,什么时候递,什么时候归

简单总结一下递归。递归就是在运行的过程中调用自己。递归需要有一个出口,如果无限递归是没有意义的,而且递归到一定程度,程序就会由于栈内存溢出导致程序报错。

我们先来看段代码:建议大家先思考这个代码在控制台输出的结果是什么?先不要看下面的结果。

经过一番思考后,相信你已经有了自己的答案,接下里就揭晓正确答案了哦。我们先来看看程序运行的结果。

#include <iostream>

using namespace std;

void sum(int num)
{
	if (num > 10) return;
	cout << num <<endl;
	num++;
	sum(num);
	cout << "end" << num << endl;
}

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

看到这个结果后,小编请大家在思考几个问题:

  1. 为什么不是输出的数字后面没有直接输出“递归后”这三个文字,而是在后面集中输出了十次“递归后”?
  2. 造成这种结果的原因是什么?
  3. 你的想法是不是跟第1个问题一样?

如果你还没思考上面的几个问题,建议想想再往下看。这对你理解递归很好的帮助!

首先程序运行,首先从main方法开始压栈执行,先执行test(1);这行代码,然后进入方法后一直递归使用test方法,但是一运行到调用递归方法时,都会重新复制一份test方法压栈执行,但是之前的test方法还是在栈中,因为一碰到递归就会一直复制递归方法到栈中执行,一直到递归出口

就这样一直到a>10时,到了递归出口,当参数a大于10时,此时栈内存中就只有一个main方法,十个递归方法。这时程序开始执行test(10)中未执行的代码,也就是递归方法后的输出语句。test(10)走完后,该方法已经运行完毕弹栈消失。接着运行test(9)中未运行的语句。以此类推,我们不难得到这样的结论:每次递归都会从方法区中复制一份方法到栈中压栈执行,这样就会一直调用递归的方法,一直压栈。直至到了递归出口,从最后进栈的那个递归方法运行递归后面的其他语句,运行完弹栈消失,然后一个接一个方法执行并且弹栈消失。也就是说最先输出的是最晚进栈的递归方法,这就是栈结构先进后出的特点。


看到这,我想大部分人已经懂了一点。但是还有有点不清晰,所以我在最后在以图片配视频的方式来帮助大家理解本文核心。我暂时认为大家不清晰的点有以下几点:

  1. 弹栈消失的过程是什么样?
  2. 第一个进栈的递归方法后的输出语句在其他递归进栈的这段时间为什么不往下运行了? 
第一个问题采用动态的视频加图片的形式解答,这样更容易理解。(感谢君哥提供工具)通过视频我们可以看出最后进栈的是最先出栈的。这就是所谓的先进后出!
tips:原网页是英文的,翻译后就成了一些看不懂的东西,忽略。
第二个问题,由于程序运行是从上往下的,所以一运行到递归就走递归的方法,实际第一个方法很痛苦,它一直在叫:“上面的哥们能快点吗?你们压着我运行不了,我很难受!”。所以早进栈执行的方法一直在等待,等待什么呢?等待他上面的递归方法弹栈消失,只有他上面的方法执行完才能轮到他。毕竟它上面压着九个哥们呢,这九个哥们不起来,最底下的你能起得来?

综上所述:

递归后的语句是能够执行的,但是执行顺序是到递归出口后,从最后一个进栈执行的方法执行递归后的语句,每执行完一个方法就弹栈消失,然后依次类推。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/358358.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

性能测试+Jmeter介绍

文章目录 什么是性能测试?性能测试的目的性能测试分类一般性能测试负载测试压力测试大数据量测试配置测试稳定性测试 性能测试术语虚拟用户并发及并发用户数响应时间每秒事务数吞吐量、吞吐率点击率性能计数器资源利用率 性能测试流程测试计划阶段测试设计阶段测试开发阶段测试…

SQL中实现行列转换

目录 方法一&#xff1a;sum case when 方法二&#xff1a;sum if 方法三&#xff1a;pivot 现在有一张表class_gender&#xff0c;内容如下&#xff1a; classgender一年级女一年级女一年级男一年级男二年级女二年级女二年级男 现在我们要根据上表&#xff0c;统计得到下…

Redis常用数据结构与应用场景

常用数据结构 StringHashListSetZset String常用操作 String应用场景 Hash常用操作 hash应用场景 Hash结构优缺点 优点 同类数据归类整合存储,方便数据管理相比String操作消耗内存与spu更小相比string更节省空间 缺点 过期功能不能使用在field上,只用用在key上Redis集群…

java学习之路(2)-编译java文件运行Java文件

创建.java后缀文本文件HelloWorld .java 写入代码&#xff1a; public class HelloWorld { public static void main(String []args) { System.out.println("Hello World"); } } 运行cmd命令 找到代码所在目录 输入javac编译Java文件生成HelloWorld.class 编译:…

CentOS 7 部署 ZeroTier Moon 节点

ZeroTier是一套使用UDP协议构建的SD-WAN网络软件&#xff0c;其主要有三部分组成&#xff1a;行星服务器Planet、月亮服务器Moon、客户端节点LEFA&#xff0c;行星服务器是ZeroTier的根节点&#xff0c;可以采用ZeroTier官方的服务器&#xff0c;也可以使用开源代码自行搭建 月…

Android中下载 HAXM 报错 Intel® HAXM installation failed,如何解决?

最近在搭建 Flutter 环境&#xff0c;但是在 Android Studio 中安装 Virtual Device 时&#xff0c;出现了一个 问题 Intel HAXM installation failed. To install Intel HAXM follow the instructions found at: https://github.com/intel/haxm/wiki/Installation-Instructio…

深度强化学习(王树森)笔记09

深度强化学习&#xff08;DRL&#xff09; 本文是学习笔记&#xff0c;如有侵权&#xff0c;请联系删除。本文在ChatGPT辅助下完成。 参考链接 Deep Reinforcement Learning官方链接&#xff1a;https://github.com/wangshusen/DRL 源代码链接&#xff1a;https://github.c…

【Servlet】Smart Tomcat插件简化Servlet开发流程及解决常见问题

个人主页&#xff1a;兜里有颗棉花糖 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 兜里有颗棉花糖 原创 收录于专栏【Servlet】 本专栏旨在分享学习Servlet的一点学习心得&#xff0c;欢迎大家在评论区交流讨论&#x1f48c; 目录 一、Smart Tomcat插件二…

【2023地理设计组一等奖】基于GIS的桥梁隧道三维建模与可视化

作品介绍 1 设计背景和意义 随着我国基础建设规模不断扩大和深入,构建桥梁可视化管理模型,全面推动智慧桥梁,已成为现代隧道桥梁建设行业的发展趋势。传统的桥梁建模工作需要复杂的算法设计并需要熟练编程实践技能,实现周期长。开发自主知识版权的桥梁建模软件系统或专用插…

时间复杂度解释

时空复杂度概述 首先o(1), o(n), o(logn), o(nlogn)是用来表示对应算法的时间复杂度,这是算法的时间复杂度的表示。不仅仅用于表示时间复杂度&#xff0c;也用于表示空间复杂度。 算法复杂度分为时间复杂度和空间复杂度。其作用&#xff1a; 时间复杂度是指执行这个算法所需要…

Keepalived + DR 集群

目录 1、Keepalive VRRP 说明 故障切换 工作原理 核心组件 2、Keepalived DR 集群 拓扑规划 前期准备 配置 Httpd 服务 配置 Nginx 服务 配置 LVS 主 node_01 配置 LVS 从 node_02 测试 LVS 集群 测试主备切换 3、Keepalived 脑裂现象 4、Keepalived 心态检测 …

C++字符串的常用操作函数全总结

文章目录 1.string、string.h和cstring的区别2.字符串定义3.求字符串的长度&#xff08;也可以求array对象长度&#xff09;4.输入字符串5.分割截取字符串4.在字符串中查找指定子字符串,并返回其第一次出现的位置5.替换字符串中的一部分6.在字符串指定位置插入字符串7.复制字符…

【漏洞通告】 Jenkins CLI 任意文件读取漏洞

漏洞概况 Jenkins是一个开源软件项目&#xff0c;是基于Java开发的一种持续集成工具&#xff0c;用于监控持续重复的工作&#xff0c;旨在提供一个开放易用的软件平台&#xff0c;使软件项目可以进行持续集成。Jenkins 有一个内置的命令行界面&#xff08;CLI&#xff09;&…

安装elasticsearch、kibana、IK分词器

1.部署单点es 1.1.创建网络 因为我们还需要部署kibana容器&#xff0c;因此需要让es和kibana容器互联。这里先创建一个网络&#xff1a; docker network create es-net 1.2.加载镜像 这里我们采用elasticsearch的7.12.1版本的镜像&#xff0c;这个镜像体积非常大&#xff0…

在Spring Boot中使用iTextPDF创建动态PDF文档

最近&#xff0c;我们的系统新增了一个客服模块&#xff0c;其中一个重要功能是能够以PDF格式导出客服与用户之间的聊天记录。这些聊天记录包含文字、图片和文件等多种内容。为了实现这一功能&#xff0c;我们首先使用了itextpdf 5.x版本制作了一个Demo。今天&#xff0c;我将与…

kubernetes-快速部署一套k8s集群

1、前置知识点 1.1 生产环境可部署Kubernetes集群的两种方式 目前生产部署Kubernetes集群主要有两种方式&#xff1a; kubeadm Kubeadm是一个K8s部署工具&#xff0c;提供kubeadm init和kubeadm join&#xff0c;用于快速部署Kubernetes集群。 二进制包 从github下载发行…

力扣题目训练(5)

2024年1月29日力扣题目训练 2024年1月29日力扣题目训练345. 反转字符串中的元音字母349. 两个数组的交集350. 两个数组的交集 II96. 不同的二叉搜索树97. 交错字符串44. 通配符匹配 2024年1月29日力扣题目训练 2024年1月29日第五天编程训练&#xff0c;今天主要是进行一些题训…

短视频与小程序:如何实现完美结合?

在短视频日益成为人们娱乐、社交和信息获取的重要渠道的今天&#xff0c;如何在短视频平台进行小程序推广成为了许多企业和品牌关注的焦点。本文将介绍如何利用短视频平台进行小程序推广&#xff0c;提升品牌曝光和用户互动。 首先&#xff0c;打开乔拓云-门店系统的后台&#…

使用new操作符,一定是在堆上申请内存么?

《法华经》曰&#xff1a;“ 世尊导师&#xff0c;安隐天人&#xff0c;我等闻记&#xff0c;心安具足。” 一、引言 我们常常张嘴就来&#xff0c;我们在堆上申请内存使用malloc() 或者new操作符&#xff0c;但是反过来说&#xff0c;使用new操作符&#xff0c;就一定是在堆…

###C语言程序设计-----C语言学习(7)#(调试篇)

前言&#xff1a;感谢您的关注哦&#xff0c;我会持续更新编程相关知识&#xff0c;愿您在这里有所收获。如果有任何问题&#xff0c;欢迎沟通交流&#xff01;期待与您在学习编程的道路上共同进步。 一. 程序调试 1.程序调试介绍&#xff1a; 程序调试是软件开发过程中非常重…