C语言-递归和迭代

 

 🌈write in front🌈
🧸大家好,我是Aileen🧸.希望你看完之后,能对你有所帮助,不足请指正!共同学习交流.
🆔本文由Aileen_0v0🧸 原创 CSDN首发🐒 如需转载还请通知⚠️
📝个人主页:Aileen_0v0🧸—CSDN博客
🎁欢迎各位→点赞👍 + 收藏⭐️ + 留言📝​
📣系列专栏:Aileen_0v0🧸的C语言学习系列专栏——CSDN博客
🗼我的格言:"没有罗马,那就自己创造罗马~" 

目录

递归概念

递归的思想

递归的限制条件

例子

1.求阶乘

 2.按顺序打印

递归与迭代

例子

1.求第n个斐波那契数

​编辑 利用递归求

利用迭代求

Summary

预告

1.汉诺塔问题

2.青蛙跳台阶问题 


本节概要

递归概念

递归:函数自己调用自己

控制台运行结果:

 

递归的思想

把一个大型问题层层转换成一个与原问题相似,但规模较小的子问题求解;直到子问题不能再被拆分,递归就结束了.--- 大事化小

递归的 递是递推的意思  归是回归的意思 


递归的限制条件

例子

1.求阶乘

不考虑栈溢出,所以n不能太大,n的阶乘就是 1-n 的数字累乘

int Fact(int n)
{if (n <= 0)return 1;elsereturn n * Fact(n - 1);
}int main()
{int n = 0;scanf("%d", &n);int ret = Fact(n);printf("%d\n", ret);return 0;
}

求阶乘的过程图解(以3为例),红色表示递退过程,绿色表示回归过程. 

 2.按顺序打印

1.Print( 1234 )
2.==>Print( 123 )                        + printf ( 4 )
3.==>Print( 12 )                + printf ( 3 )
4.==>Print( 1 )        + printf ( 2 )
5.==> printf ( 1 )

画图推演:

 

//按顺序打印
void Print(int n)
{if (n > 9)Print(n / 10);printf("%d ", n % 10);
}int main() 
{int n = 0;scanf("%d", &n); //1234Print(n);return 0;}

运行结果:

 

在 C 语言中,如果被除数和除数都是整数,则使用除号 / 进行运算时,结果将被截断为整数,不会有小数部分。如果被除数和除数中至少有一个是浮点数,则使用除号 / 进行运算时,结果将保留小数部分。例如:

int a = 5, b = 2;
float c = 5.0, d = 2.0;int result1 = a / b;    // 结果为 2
float result2 = a / b;  // 结果为 2.0
float result3 = c / d;  // 结果为 2.5

在第一个例子中,因为被除数和除数都是整数,所以结果被截断为整数 2。而在第二个例子中,虽然使用的是整数变量,但因为将运算结果存储在浮点数变量中,所以结果被转换为浮点数 2.0。在第三个例子中,被除数和除数都是浮点数,所以结果保留小数部分,为浮点数 2.5。


递归与迭代

虽然递归很好用,但是如果递归深度太深可能会发生栈溢出的问题.

这是刚刚打印,1234的例子,我们通过函数内存中的栈区去观察,它是如何进行打印的,当执行完所有函数以后我们会发现栈区里会给每一个执行完的函数开辟一个空间,直到函数执行完以后,这些空间才会被一个一个的释放出来.

如果这个打印数字很大,比如说 n = 10000 栈的内存没有那么大,就会导致在后面继续开辟内存空间的时候,栈区没有足够的空间提供给函数进行栈帧开辟,就会发生栈溢出(stack over flow)的现象

void test(int n)
{if (n <= 10000){printf("%d\n", n);test(n + 1);}
}
int main()
{test(1);return 0;
}

递归层次过深,发生栈溢出现象 

迭代: 表示一种重复做的事情,循环是一种迭代

我们可以通过迭代(循环)解决阶乘问题

int main()
{int n = 0;scanf("%d", &n);int i = 0;int ret = 1;for (i = 1; i <= n; i++){ret *= i;}printf("%d\n", ret);return 0;
}

运行结果:

例子

1.求第n个斐波那契数

斐波那契数列: 1 1 2 3 5 8 13 21 34 55
 利用递归求
//求第n个斐波那契数
int Fib(int n)
{if (n <= 2)return 1;elsereturn Fib(n - 1) + Fib(n - 2);
}int main()
{int n = 0;scanf("%d", &n);int ret = Fib(n);printf("%d\n", ret);return 0;
}

运行结果: 

 

//求第n个斐波那契数
int count = 0;
int Fib(int n)
{if (n == 3)count++;if (n <= 2)return 1;elsereturn Fib(n - 1) + Fib(n - 2);
}int main()
{int n = 0;scanf("%d", &n);int ret = Fib(n);printf("%d\n", ret);printf("count = %d\n", count);return 0;
}

 


利用迭代求

int Fib(int n)
{int a = 1;int b = 1;int c = 1;while (n > 2){c = a + b;a = b;b = c;n--;}return c;
}int main()
{int n = 0;scanf("%d", &n);int ret = Fib(n);printf("%d\n", ret);//printf("count = %d\n", count);return 0;
}

运行结果:

Summary

1.如果一个问题使用 递归方法 写代码, 是非常方便的,简单

    写出的代码是没有明显缺陷的,这时候使用递归即可

2.如果使用递归写的代码,是存在明显缺陷

比如:栈溢出,效率低下

这时候必须考虑其他方式,比如: 迭代 

预告

1.汉诺塔问题

 相传在古印度圣庙中,有一种被称为汉诺塔的游戏。该游戏是在一块铜板装置上,有三根杆(编号A、B、C),在A杆自下而上、由大到小按顺序放置64个金盘。                        ​​​​​​​        ​​​​​​​        ​​​​​​​ 游戏的目标:把A杆上的金盘全部移到C杆上,并仍保持原有顺序叠好。操作规则:每次只能移动一个盘子,并且在移动过程中三根杆上都始终保持大盘在下,小盘在上,操作过程中盘子可以置于A、B、C任一杆上。

2.青蛙跳台阶问题 

有一只青蛙,一次可以跳一个台阶,也可跳2个台阶如果有n个台阶,这只青蛙有多少种跳法,跳上n个台阶

 

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

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

相关文章

HTML常用标签、CSS基础

HTML常用标签 标签的分类 1. 单标签 img br hr <img /> 2. 双标签 a h p div <a></a> 3. 按照标签属性分类 1. 块儿标签 # 自己独自占一行 h1-h6 p div 2. 行内(内联)标签 # 自身文本有多大就占多大 …

华为OD机考算法题:支持优先级的队列

题目部分 题目支持优先级的队列难度易题目说明实现一个支持优先级的队列&#xff0c;高优先级&#xff08;数字越大&#xff0c;优先级越高&#xff09;先出队列&#xff1b;同优先级时先进先出。 如果两个输入数据和优先级都相同&#xff0c;则后一个数据不入队列被丢弃。 队…

Windows下Redis配置密码,并设置自启动

1. 解压redis修改配置文件&#xff08;设置密码&#xff09; 打开Redis的配置文件&#xff0c;通常位于Redis安装目录下的 redis.windows.conf 去掉"requirepass"前注释&#xff0c;修改"foobared"为要设置的密码 requirepass foobared2.注册服务&#x…

Docker 批量导出/导入镜像

可以编写一个脚本&#xff0c;该脚本循环遍历一个文件夹中的所有镜像存档文件&#xff0c;并使用 docker load 命令加载它们。以下是一个 Bash 脚本示例&#xff1a; 导出&#xff1a; #!/bin/bash### 批量docker镜像的_脚本 # 获取到 "image:tag" 格式的镜像名 IMG…

Mac 安装psycopg2,报错Error: pg_config executable not found.

在mac 上安装psycopg2的方法&#xff1a;执行&#xff1a;pip3 install psycopg2-binary。 如果执行pip3 install psycopg2&#xff0c;无法安装psycopg2 报错信息如下&#xff1a; Collecting psycopg2Using cached psycopg2-2.9.9.tar.gz (384 kB)Preparing metadata (set…

9.Vue2-监听属性的用法

题记 vue2监听属性的用法 计数器 使用watch实现计数器&#xff1a; <!DOCTYPE html> <html> <head> <meta charset"utf-8"> <title>实例</title> <script src"https://cdn.staticfile.org/vue/2.4.2/vue.min.js"…

SpringCloud之Eureka的学习【详细】

目录 服务架构演变 单体架构 分布式架构 分布式架构需要考虑的问题 微服务 架构比较 微服务技术对比 服务拆分注意事项 案例 服务远程调用 RestTemplate Eureka注册中心 RestTemplate存在的问题 服务调用考虑的问题 Eureka的作用 搭建EurekaServer 服务注册 …

刷穿力扣(31~60)

更好的阅读体验 \huge{\color{red}{更好的阅读体验}} 更好的阅读体验 31. 下一个排列 排列原理就是 C 中的 next_permutation 函数&#xff0c;生成指定序列的下一个全排列从给定序列的最右端开始&#xff0c;找到第一个满足 nums[i] < nums[i 1] 的元素 nums[i]若找不到这…

挑战吧,HarmonyOS应用开发工程师

一年一度属于工程师的专属节日1024&#xff0c;多重活动亮相啦~ 参与活动即有机会获得HUAWEI Freebuds 5i 耳机等精美礼品&#xff01; 点击“阅读原文”查看更多活动详情&#xff01;

算法笔记【8】-合并排序算法

文章目录 一、前言二、合并排序算法基本原理三、实现步骤四、优缺点分析 一、前言 合并排序算法通过采用分治策略和递归思想&#xff0c;实现了高效、稳定的排序功能。本文将深入探讨合并排序算法的原理、实现步骤&#xff0c;并讨论其优缺点。 二、合并排序算法基本原理 合…

双向链表的初步练习

&#x1d649;&#x1d65e;&#x1d658;&#x1d65a;!!&#x1f44f;&#x1f3fb;‧✧̣̥̇‧✦&#x1f44f;&#x1f3fb;‧✧̣̥̇‧✦ &#x1f44f;&#x1f3fb;‧✧̣̥̇: Solitary-walk ⸝⋆ ━━━┓ - 个性标签 - &#xff1a;来于“云”的“羽球人”…

java集合之List接口实现类常用方法详解

目录 一、List集合概述 二、ArrayList类 三、ArrayList常用方法实例 四、LinkedList类 五、Linkedist常用方法实例 一、List集合概述 java.util.List接口继承自Collection接口&#xff0c;是单列集合的一个分支&#xff0c;通常将实现了List接口的对象称为List集合&#x…

MySQL数据库干货_09—— MySQL中的外键约束(Foreign Key)

外键约束(Foreign Key) 添加外键约束 使用DDL语句添加外键约束 ALTER TABLE 表名 ADD CONSTRAINT 约束名 FOREIGN KEY( 列 名 ) REFERENCES 参照的表名(参照的列名);示例一&#xff1a; 创建 departments 表包含 department_id 、department_name &#xff0c;location_id。…

dbeaver配置es连接org.elasticsearch.xpack.sql.jdbc.EsDriver

查看目标es服务版本&#xff0c;下载对应驱动

[UDS] --- CommunicationControl 0x28

1 0x28功能描述 根据ISO14119-1标准中所述&#xff0c;诊断服务28服务主要用于网络中的报文发送与接受&#xff0c;比如控制应用报文的发送与接收&#xff0c;又或是控制网络管理报文的发送与接收&#xff0c;以便满足一定场景下的应用需求。 2 0x28应用场景 一般而言&#…

k8s节点已有镜像,但Pod一直在拉取镜像时卡着

Pod状态为ContainerCreating&#xff0c;查看日志提示pull镜像&#xff0c;但该镜像在Node节点已经存在&#xff0c;且拉取策略为IfNotPresent 解决&#xff1a;重启kubelet

迁移学习 - 微调

什么是与训练和微调&#xff1f; 你需要搭建一个网络模型来完成一个特定的图像分类的任务。首先&#xff0c;你需要随机初始化参数&#xff0c;然后开始训练网络&#xff0c;不断调整参数&#xff0c;直到网络的损失越来越小。在训练的过程中&#xff0c;一开始初始化的参数会…

指针相关面试题目

数组名的意义&#xff1a; 1. sizeof( 数组名 ) &#xff0c;这里的数组名表示整个数组&#xff0c;计算的是整个数组的大小。 2. & 数组名&#xff0c;这里的数组名表示整个数组&#xff0c;取出的是整个数组的地址。 3. 除此之外所有的数组名都表示首元素的地址。 下…

【地理位置识别】IP归属地应用的特点

IP归属地应用是一类用于确定特定IP地址的地理位置信息&#xff08;通常是城市、地区或国家&#xff09;的工具和服务。以下是IP归属地应用的几个主要特点&#xff1a; 地理位置识别&#xff1a; IP归属地应用主要用于确定IP地址的地理位置。这可以帮助组织更好地了解其网站访问…