「函数递归小课堂」~(C语言)

先赞后看,不足指正!

这将对我有很大的帮助!

所属专栏:C语言知识

阿哇旭的主页:Awas-Home page

目录

引言 

1. 什么是递归?

2. 递归的限制条件 

3. 递归应用举例 

3.1 求 n 的阶乘

3.2 图例演示

3.3 代码实现 

4. 递归问题 

4.1 打印整数n的每一位

4.2 图例演示

4.3 代码实现

5. 递归与迭代 

6. 知识拓展

7. 结语


引言 

        在前面,我们了解并学习到了关于C语言函数相关的概念知识,接下来我们将深入探究函数递归的奥秘。

        那么,话不多说,我们一起来看看吧!


1. 什么是递归?

        递归是我们学习C语言函数经常穿插的一个话题,那递归到底是何方神圣?

        从字面意思理解起来不难,递归其实是一种解决问题的方法,在C语言中,递归就是函数自己调用自己。下面是一个简单的例子:

#include<stdio.h>
int main()
{printf("a-wax");main(); //main函数自己调用自己return 0;
}

        上面举了一个最简单的函数递归例子,运行程序会陷入死递归,导致栈溢出(Stack overflow)。


2. 递归的限制条件 

        在我们使用递归的时候,不能让它无限的递归,在达到我们的要求时,就停止。因此,函数递归有两个必要条件:

  • 递归存在限制条件,当满足这个限制条件的时候,递归便不再继续。
  • 每次递归调用之后越来越接近这个限制条件。

3. 递归应用举例 

3.1 求 n 的阶乘

在不考虑栈溢出的情况下,计算正整数 n 的阶乘。

阶乘公式:n ! = n * (n - 1) !

        解题思路:n ! -> n * (n - 1) !

                                  (n - 1) ! ->(n-1) * (n-2) !

                          ......

        通过这样,就可以把一个较大的问题,转换为一个与原问题相似,但规模较小的问题来解决。

3.2 图例演示

3.3 代码实现 

// 递归求n的阶乘
#include<stdio.h>int Fact(int n)
{if (n == 0) //回归条件return 1;else        //递推调用return n * Fact(n - 1);
}int main()
{int n = 0;printf("请输入要阶乘的数:\n");scanf("%d", &n);int ret = Fact(n);printf("阶乘的结果:%d", ret);return 0;
}


4. 递归问题 

4.1 打印整数n的每一位

输入一个整数m,打印这个按照顺序打印整数的每一位。

例如:

输入:1014    输出:1 0 1 4

输入:220      输出:2 2 0

        解题思路: 如果n是一位数,n的每一位就是n自己, n是超过一位数的话,就得拆分每一位。

        我们可以发现数字的最低位是最容易得到的,通过%10就能得到。

        此时,可以定义一个print函数来打印n的每一位数字。

Print(n)
如果n是1014,那表⽰为
Print(1014) //打印1014的每⼀位
其中1014中的4可以通过%10得到,那么
Print(1014)就可以拆分为两步:
1. Print(1014/10) //打印101的每⼀位
2. printf(1014%10) //打印4
完成上述2步,那就完成了1014每⼀位的打印
那么Print(101)⼜可以拆分为Print(101/10) + printf(101%10)

4.2 图例演示

4.3 代码实现

//打印n的每一位
#include<stdio.h>void Print(int n)
{if (n > 9) //回归条件{Print(n / 10); //递推调用}printf("%d ", n % 10);
}int main()
{int n = 0;printf("请输入一个数:\n");scanf("%d", &n);Print(n);return 0;
}


5. 递归与迭代 

        有时候,递归虽然好用,但也存在一些问题,就比如求第n位斐波那契数,是不适合用递归求解的。

#include<stdio.h>int Fibon(int n)
{if (n <= 2)return 1;elsereturn Fibon(n - 1) + Fibon(n - 2);
}int main()
{int n = 0;printf("请输入要求第几个斐波那契数:\n");scanf("%d", &n);int ret = Fibon(n);printf("第%d个斐波那契数为%d\n", n, ret);return 0;
}

         当我们输入n位50的时候,需要很长时间才能算出结果,这也说明递归的写法是比较低效的,为什么呢?在递归计算过程中,会有重复计算,且递归层次越深,冗余计算就会越多,这就是导致效率低的主要原因。

        此时,我们可以用迭代的方法来求解:

// 迭代求第n个斐波那契数
#include<stdio.h>int Fibon(int n)
{// 中间变量int a = 1;int b = 1;int c = 1;if (n >= 3){for (int i = 3; i <= n; i++){c = a + b;a = b;b = c;}}return c;
}int main()
{int n = 0;printf("请输入要求第几个斐波那契数:\n");scanf("%d", &n);int ret = Fibon(n);printf("第%d个斐波那契数为%d\n", n, ret);return 0;
}

         运行代码,我们会发现,速度明显比递归要快,效率更高。


6. 知识拓展

  • 小青蛙跳台阶问题
  • 汉诺塔问题

7. 结语

        希望这篇文章对大家有所帮助,如果你有任何问题和建议,欢迎在评论区留言,这将对我有很大的帮助。

        完结!咻~

 

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

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

相关文章

基于JAVA+SpringBoot+Vue的前后端分离的电影院售票管理运营平台

✌全网粉丝20W,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取项目下载方式&#x1f345; 一、项目背景介绍&#xff1a; 该系统研究背景聚焦于…

解密短视频上火爆的“私董会”现象

关注卢松松&#xff0c;会经常给你分享一些我的经验和观点。 最近“私董会”一词再一次上了热门&#xff0c;先是一夜暴火的商业博主dada管培生翻车暴雷&#xff0c;后面是三言财经、互联网大V纷纷发表了自己的看法。 国内领先的私董会服务机构通常每年的收费都在3万元起步。…

Stable Diffusion系列(六):原理剖析——从文字到图片的神奇魔法(潜空间篇)

文章目录 LDM概述原理模型架构自编码器模型扩散模型条件引导模型图像生成过程 实验结果指标定义IS&#xff08;越大越好&#xff09;FID&#xff08;越小越好&#xff09; 训练成本与采样质量分析不带条件的图片生成基于文本的图片生成基于语义框的图片生成基于语义图的图片生成…

Open3D在点云上画直线

想在点云上做一些标识&#xff0c;发现画直线比较方便&#xff0c;下面是我画了一个三角形。可以根据自己的情况改变坐标画出不同的形状 pcd.translate(np.array([0,0,20])) points np.asarray(pcd.points) centroid points.mean(axis0) x1 length1[1] y1 centroid[1] z1…

virtualbox虚拟机运行中断,启动报错“获取 VirtualBox COM 对象失败”

文章目录 问题现象排查解决总结 问题现象 2月7日下午四点多&#xff0c;我已经休假了&#xff0c;某县的客户运维方打来电话&#xff0c;说平台挂了&#xff0c;无法访问客户是提供的一台Windows server机器部署平台&#xff0c;是使用virtualbox工具安装的CentOS7.9虚拟机和运…

Mysql事务原理与优化

概述 我们的数据库一般都会并发执行多个事务&#xff0c;多个事务可能会并发的对相同的一批数据进行增删改查操作&#xff0c;可能就会导致我们说的脏写、脏读、不可重复读、幻读这些问题。 这些问题的本质都是数据库的多事务并发问题&#xff0c;为了解决多事务并发问题&…

华为配置旁挂二层组网隧道转发示例

配置旁挂二层组网隧道转发示例 组网图形 业务需求组网需求数据规划配置思路配置注意事项操作步骤配置文件扩展阅读 业务需求 企业用户通过WLAN接入网络&#xff0c;以满足移动办公的最基本需求。且在覆盖区域内移动发生漫游时&#xff0c;不影响用户的业务使用。 组网需求 AC组…

【python学习篇1】python基本语法

目录 一、第一个python程序 二、基本语法&#xff0c;数据类型&#xff0c;字面量&#xff0c;循环语句等内容 2.1字面量 2.2注释 2.2.1单行注释 2.2.2多行注释 2.3变量 2.3.1认识变量 2.3.2查看数据类型 2.3.3数据类型转换 2.3.4字符串的三种定义方式 2.3.5字符串…

Flutter开发环境和打包流程

Flutter开发环境和打包流程 1.本地开发环境 1.1.安装flutter 官网安装flutter有2种方式&#xff0c;一种是下载flutter的sdk包&#xff0c;一种是VS Code直接安装&#xff0c;照着官网的安装flutter的流程走没有什么问题 1.2.安装Android Studio 去Android Studio的官网直…

若依不分离版本部署流程

一、分离与不分离的区别 参考博客&#xff1a;前后端分离与不分离的本质区别&#xff01;_前后端分离本质-CSDN博客 概念适用场景前后端不分离前端页面看到的效果都是由后端控制&#xff0c;由后端渲染页面或重定向适合纯网页应用前后端分离后端仅返回前端所需的数据&#xf…

Android widget基础指南

widget的概念最早是由一名叫Rose的苹果工程师提出&#xff0c;后来经过多方面机缘巧合的发展下&#xff0c;便有了今天Android平台上的小组件widget&#xff0c;一般APP开发可能应用场景较少&#xff0c;最常见的莫过于天气APP的widget。但对于从事IOT或车载方向的同学&#xf…

WebRTC最新版报错解决:FileNotFoundError: LASTCHANGE.committime (二十五)

简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长! 优质专栏:Audio工程师进阶系列【原创干货持续更新中……】🚀 优质专栏:多媒体系统工程师系列【原创干货持续更新中……】🚀 人生格言: 人生从来没有捷径,只…

图形渲染基础学习

原文链接&#xff1a;游戏开发入门&#xff08;三&#xff09;图形渲染_如果一个面只有三个像素进行渲染可以理解为是定点渲染吗?-CSDN博客 游戏开发入门&#xff08;三&#xff09;图形渲染笔记&#xff1a; 渲染一般分为离线渲染与实时渲染&#xff0c;游戏中我们用的都是…

【Linux取经路】文件系统之重定向的实现原理

文章目录 一、再来理解重定向1.1 输出重定向效果演示1.2 重定向的原理1.3 dup21.4 输入重定向效果演示1.5 输入重定向代码实现 二、再来理解标准输出和标准错误2.1 同时对标准输出和标准错误进行重定向2.2 将标准输出和标准错误重定向到同一个文件 三、再看一切皆文件四、结语 …

书生开源大模型训练营-第3讲笔记

5.Langchain和InternLM搭建知识库 5.1环境 还是一样&#xff0c;开发机中创建镜像&#xff0c;以及所需依赖 pip install modelscope1.9.5 pip install transformers4.35.2 pip install streamlit1.24.0 pip install sentencepiece0.1.99 pip install accelerate0.24.15.2模…

docker安装一系列镜像

启动docker systemctl start docker docker 启动已经停止的容器 docker start idOrName PS&#xff1a;idOrName为容器的id或者名称 1、安装mysql镜像 拉取mysql5.7的镜像 docker pull mysql:5.7 查看镜像 docker images 启动mysql #启动mysql docker run --name mysql…

云呐电网智能运维包含哪些?智能运维都有哪些框架

电网智能运维是一个复杂的系统&#xff0c;包括多种技术和方法&#xff0c;为提升电力系统的效率和稳定性。以下是你提出的问题的实际答案: 网络智能运维的核心技术与应用&#xff1a; 故障检测&#xff1a;根据实时监测和数据分析&#xff0c;对电网中的故障进行快速、准确的…

LabVIEW读取excel日期

LabVIEW读取excel日期 | Excel数据表格中有日期列和时间列&#xff0c;如下表所示&#xff1a; 通过LabVIEW直接读取Excel表格数据&#xff0c;读出的日期列和时间列数据与原始表格不一致&#xff0c;直接读出来的数据如下表所示&#xff1a; 日期、时间列数据异常 问题产生原因…

VBA:批量复制sheet内指定内容

VBA. 批量复制sheet内指定内容 背景&#xff1a;一个excel内有包含0-18序号的Sheet&#xff0c;需要将1-18的sheet内包含标准差的行复制到sheet”0“中。 方法&#xff1a; 从1-18遍历sheet&#xff0c;找到单元格值为”标准差“的行&#xff0c;然后&#xff08;仅复制值&a…

Linux下多核CPU指定程序运行的核

设置程序在指定CPU核心运行 一、如何查看程序运行的CPU信息 1.1 查看当前系统CPU有几个核心 查看CPU核心数量&#xff1a;lscpu 1.2 查看程序的PID ps aux|grep cpu_test1.3 查看程序可运行的CPU taskset -c -p pid1.4 设置程序在指定核心上运行 1.4.1 通过运行时的参数设…