函数递归那些事

news2024/12/26 23:49:41

什么是递归

递归就是函数自己调用自己,而递归的本质其实是一种解决问题的方法。

递归的思想

递归的思想是把复杂问题大事化小的过程。即把一个大型复杂的问题不断的拆分成与原问题相似,但规模较小的子问题,直到子问题不能被拆分,递归就结束了!

递归的限制条件

其实每一次函数调用,都会在内存的栈区上开辟一块空间,直到调用结束,这块空间才会被回收!函数如果递归层次太深或者无限的递归下去,栈空间被耗干,就会导致栈溢出的问题!

比如调试下面这段代码就会报错

#include <stdio.h>
int i = 0;
int main()
{
	printf("%d\n", i);
	i++;
	main();
	return 0;
}

通过这段代码,我们可以发现递归的两个条件限制:

1:递归存在结束的条件,当满足这个条件的时候,递归便不再继续

2:每次递归调用之后,都越来越接近这个限制条件

如何使用

比如计算n的阶乘,这个问题就可以用递归来解决,即n的阶乘等于n乘n-1的阶乘

直接上代码

#include <stdio.h>
int fun(int n)//递归
{
	if (n == 0)
	{
		return 1;
	}
	else
	{
		return n * fun1(n - 1);
	}
}
int main()
{
	int n = 3;//计算3的阶乘
	printf("%d! = %d\n", n, fun(n));
	return 0;
}

其中fun函数就是用来计算n的阶乘的!

该函数的执行逻辑:

1:当n==0的时候,直接返回1,可以看成是让递归结束的条件

2:当n!=0的时候,返回n乘(n-1)的值,每次调用fun函数后参数n都趋向于0

以上面这段代码举例,要计算5的阶乘,先画图

第一次调用fun函数时n==3,执行return n*fun(n-1);语句

而该语句中调用fun函数,计算n-1的阶乘(即2的阶乘)

因为n==2,所以执行return n*fun(n-1);语句

该语句中调用fun函数,计算n-1的阶乘(即1的阶乘)

因为n==1,所以执行return n*fun(n-1);语句

该语句中调用fun函数,计算n-1的阶乘(即0的阶乘)

而n==0,执行return 1;语句

然后将返回值一次带回去,最后计算结果为6

运行结果为:

递归的特点

1:递归是用少量的代码完成了大量复杂的运算

2:由于每次调用都会在内存的栈区上开辟一块空间,所以递归函数在调用的时候涉及一些运行时的开销

递归的使用场景

递归并不一定适合所有的问题,一般情况下,使用迭代(循环)的方法来解决问题的效率要更高,而只有当一个问题非常复杂,难以用迭代的方法来处理时,使用递归实现的简洁性便可以弥补它所带来的运行时开销

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Python学习day16-类与对象

这里写目录标题 类示例 成员方法self关键字 类与对象构造方法其他类内置方法&#xff08;魔术方法&#xff09;_str_符号_Lt_符号le小于等于比较eq比较运算小结 类 在Python中&#xff0c;class&#xff08;类&#xff09;是一种用于创建对象的模板或蓝图。它封装了数据&#…

MySQL9.0安装教程

软件介绍 MySQL是一个关系型数据库管理系统&#xff0c;是最流行的关系型数据库管理系统之一&#xff0c;在 WEB 应用方面&#xff0c;MySQL是最好的 RDBMS (Relational Database Management System&#xff0c;关系数据库管理系统) 应用软件之一。 软件下载 https://pan.qu…

预报名管理系统--论文pf

TOC springboot374预报名管理系统--论文pf 第1章 绪论 1.1选题动因 当前的网络技术&#xff0c;软件技术等都具备成熟的理论基础&#xff0c;市场上也出现各种技术开发的软件&#xff0c;这些软件都被用于各个领域&#xff0c;包括生活和工作的领域。随着电脑和笔记本的广泛…

UI设计:蒸汽波风格页面有啥特征,应用哪些场景?

一、什么是蒸汽波风格 蒸汽波风格&#xff08;Steampunk&#xff09;是一种将19世纪工业时代的技术和想象力与未来科技相结合的艺术和文化流派。它通常描绘了一个类似维多利亚时代的世界&#xff0c;其中蒸汽动力是主要能源&#xff0c;机械装置和复杂的齿轮系统被广泛应用。 …

C#商城源码与.NET技术在电商领域的应用_OctShop

在当今互联网化商业的浪潮中&#xff0c;网上商城成为了企业拓展市场、提升竞争力的重要手段。而 C# 商城源码和.NET 相关的技术在构建高效、稳定、安全的网上商城中发挥着关键作用。OctShop将深入探讨 C# 商城源码、.NET 商城源码、C# 网上商城以及.NET Core 商城源码的特点、…

JavaScript基础(34)_BOM介绍、BOM对象

BOM 浏览器对象模型&#xff0c;BOM可以使我们通过JS来操作浏览器。在BOM中为我们提供了一组对象&#xff0c;用来完成对浏览器的操作。 BOM对象 Window&#xff1a;代表整个浏览器的窗口&#xff0c;同时window也是网页中的全局对象。Navigator&#xff1a;代表当前浏览器的…

VS2022实用调试技巧超详解

文章目录 1. 什么是 bug2. 什么是调试(debug)3. Debug和 Release4.VS调试快捷键4.1 环境准备4.2 调试快捷键 5. 监视和内存观察5.1 监视5.2 内存 6. 调试举例17. 调试举例29. 编程常见错误归类9. 1 编译型错误9.2 链接型错误9. 3 运行时错误 本文章以VS2022为例讲解调试功能&am…

Linux内核分析(调度类和调度实体)

文章目录 前言一、调度类1. stop_sched_class2. dl_sched_class3. rt_sched_class4. fair_sched_class5. idle_sched_class总结 二、调度类中的操作函数三、调度实体 前言 调度是操作系统内核的一个关键职责&#xff0c;它涉及到如何合理分配CPU时间给不同的进程或线程。在Lin…

SpringBoot依赖之Spring Data Redis 一 String类型

Spring Data Redis(一) 概念 Spring Data Redis (AccessDriver) 依赖名称: Spring Data Redis (AccessDriver)功能描述: Advanced and thread-safe Java Redis client for synchronous, asynchronous, and reactive usage. Supports Cluster, Sentinel, Pipelining, Auto-Re…

输入输出(I/0)流

一、 File: 是所有文件或者文件夹的路径抽象表现形式 file自动重写了toString方法&#xff0c;所以直接打印显示的是file内容 构造方法&#xff1a; public File(String pathname) public File(String parent,String child) public File(File parent,…

rust操作rabbitmq

Rust 操作 Rabbitmq 使用docker快速部署rabbitmq docker pull rabbitmq:management # 15672为rabbitmq 管理员端口&#xff0c;默认账号密码为guest(账号密码相同) docker run -d --name rabbitmq -p 5672:5672 -p 15672:15672 rabbitmq:managementrust 添加amqp库lapin car…

影院订票系统/电影院售票系统/电影院购票系统的设计与实现/影院管理系统

摘 要 “互联网”的战略实施后&#xff0c;很多行业的信息化水平都有了很大的提升。但是目前很多电影院日常业务仍是通过人工管理的方式进行&#xff0c;需要在影院订票投入大量的人力进行很多重复性工作&#xff0c;这样就浪费了许多的人力物力&#xff0c;工作效率较低&…

【Godot4自学手册】第四十五节用着色器(shader)制作水中效果

本节内容&#xff0c;主要学习利用着色器制作水波纹效果&#xff0c;效果如下&#xff1a; 一、搭建新的场景 首先我们新建场景&#xff0c;根节点选择Node2D&#xff0c;命名为Water&#xff0c;给根节点添加两个Tilemap节点&#xff0c;一个命名为Background主要用于绘制地…

JUC介绍

一、并发与并行 1.并发 早期计算机CPU是单核的&#xff0c;为了提高CPU的利用率&#xff0c;减少等待时间&#xff0c;使用到了并发工作的理论 并发就是将CPU资源合理分配给多个任务&#xff0c;当一个任务执行I/O操作时&#xff0c;转去执行其他任务 2.并行 针对多核CPU&…

25届科大讯飞飞星计划 AI研究算法工程师 面经

目录 一面/技术面 2024/08/15 &#x1f4cb; 总结&#xff1a; 本来应该是在7月底面试的&#xff0c;但因为有事就拖到了现在&#xff0c;或许是飞星计划里最晚面试的一批&#xff1f;面试官很和蔼&#xff0c;问的问题不算难&#xff0c;总体体验还算不错。 一面/技术面 2024/…

MySQL基础--逻辑存储结构,架构

逻辑存储结构 表空间&#xff08;ibd 文件&#xff09;&#xff1a;一个 mysql 实例可以对应多个表空间&#xff0c;用于存储记录&#xff0c;索引等数据。 段&#xff1a;分为数据段&#xff0c;索引段&#xff0c;回滚段&#xff0c;InnoDB 是索引组织表&#xff0c;数据段就…

Unity引擎基础知识

目录 Unity基础知识概要 1. 创建工程 2. 工程目录介绍 3. Unity界面和五大面板 4. 游戏物体创建与操作 5. 场景和层管理 6. 组件系统 7. 脚本语言C# 8. 物理引擎和UI系统 学习资源推荐 Unity引擎中如何优化大型游戏项目的性能&#xff1f; Unity C#脚本语言的高级编…

修复 iPad 卡在准备更新或正在进行更新的问题

为什么iPad 更新卡住了&#xff1f;原因很难确定&#xff0c;因为 iPad 的许多故障和状况都可能导致 iPad 无法更新 iOS 和应用程序。此外&#xff0c;很难弄清楚这种情况持续了多长时间。但是&#xff0c;您不必太担心&#xff0c;因为这只是一个小案例&#xff0c;您可以阅读…

Java入门(上)

day01 - Java基础语法 1. 人机交互 1.1 什么是cmd&#xff1f; 就是在windows操作系统中&#xff0c;利用命令行的方式去操作计算机。 我们可以利用cmd命令去操作计算机&#xff0c;比如&#xff1a;打开文件&#xff0c;打开文件夹&#xff0c;创建文件夹等。 1.2 如何打…

单元训练13:串行接口的进阶应用

蓝桥杯&#xff0c;小蜜蜂&#xff0c;单元训练13&#xff1a;串行接口的进阶应用 /** Description:* Author: fdzhang* Email: zfdcqq.com* Date: 2024-08-17 15:41:34* LastEditTime: 2024-08-17 19:48:35* LastEditors: fdzhang*/ #include "stc15f2k60s2.h"#defi…