36-递归与迭代

36-1 用递归和迭代解决问题

1、求n的阶乘

公式:

n!=1×2×3×...×(n-1)×n。用递归方式定义:0!=1,n!=(n-1)!×n。

代码1:

我们先回忆一下之前用循环怎么实现的吧

非递归,也可称迭代

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

运行结果:

代码2:

递归

int fac(num)
{if (num > 1){return num * fac(num - 1);}else{return 1;}
}
int main()
{int n = 0;scanf("%d", &n);int ret = fac(n);printf("%d\n", ret);return 0;
}

运行结果:

有些时候,并不适合用递归

2、求第n个斐波那契数

斐波那契数列:在数学上,斐波那契数列可以通过递推的方式定义,从第三项开始,每一项都等于前两项之和。具体的递推公式为F(0)=0,F(1)=1,F(n)=F(n-1)+F(n-2),其中n≥2且n属于自然数集。

代码1:递归方法

int F(n)
{int ret = 0;if (n >= 2){return F(n - 1) + F(n - 2);}else if (0 == n){return 0;}else{return 1;}
}
int main()
{int n = 0;scanf("%d", &n);int ret = F(n);printf("%d\n", ret);return 0;
}

 运行结果:

但是,这里会有大量重复的计算!严重浪费时间

我们可以进行一个测试

int count = 0;  //计数器
int F(n)
{int ret = 0;if (n == 3){count++;  //计数,一共算了多少次第三个斐波那契数}if (n >= 2){return F(n - 1) + F(n - 2);}else if (0 == n){return 0;}else{return 1;}
}
int main()
{int n = 0;scanf("%d", &n);int ret = F(n);printf("%d\n", ret);printf("count=%d\n", count);return 0;
}

运行结果:

竟然算了将近4万次!!!

效率太低了,用递归太不合适啦!我们试试迭代吧~~~

代码2:迭代

①for循环

int Fib(n)
{if (n >= 2){int sum = 0;int i = 0;int n1 = 1;  //第一个数int n2 = 1;  //第二个数for (i = 0; i < n-2; i++)  //直接从第3个算起{sum = n1 + n2;n1 = n2;n2 = sum;}return sum;}else if(0==n){return 0;}else{return 1;}
}
int main()
{int n = 0;scanf("%d", &n);int ret = Fib(n);printf("%d\n", ret);
}

②while循环(该代码默认n>=1)

int Fib(n)
{int n1 = 1;int n2 = 1;int n3 = 1;while (n >= 3){n3 = n1 + n2;n1 = n2;n2 = n3;n--;}return n3;
}
int main()
{int n = 0;scanf("%d", &n);int ret = Fib(n);printf("%d\n", ret);
}

再使用这两个代码进行测试,你会发现代码运行速度明显比递归的速度快

注意:如果用特别大的数测试,可能会得到负值,这是因为溢出了,关于溢出的问题这里不进行展开

36-2 权衡递归与迭代的使用

1、许多问题是以递归的形式进行解释的,这只是因为它比非递归的形式更为清晰。

2、但是这些问题的迭代实现往往比递归实现效率更高,虽然代码的可读性稍微差些。

3、当一个问题相当复杂,难以用迭代实现时,此时递归实现的简洁性便可以补偿它所带来的运行时开销。

4、如果使用递归没有出现明显的问题,递归可以使用;但是如果有类似的明显问题,则采用非递归的方法解决。

5、递归的层次太深,会出现栈溢出的现象。

应对策略:

①将递归改写成非递归

②使用static对象替代nonstatic局部对象。在递归函数设计中,可以使用static对象替代nonstatic局部对象(即栈对象),这不仅可以减少每次递归调用和返回时产生和释放nonstatic对象的开销,而且static对象还可以保存递归调用的中间状态,并且可为各个调用层所访问。

当然,这只是一些可能的解决方案,并不一定真的能够解决栈溢出的问题

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

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

相关文章

精酿啤酒:酿造工艺的创新与实验探索

在啤酒酿造领域&#xff0c;创新与实验探索一直是推动品质提升和品类丰富的重要动力。Fendi Club啤酒作为一家注重品质和口感的品牌&#xff0c;在酿造工艺方面不断创新与尝试&#xff0c;为消费者带来更多与众不同的风味体验。 Fendi Club啤酒在原料选择方面不断进行创新与实验…

超级码科技股份携手品品香开数字茶业新范式,实现全产业链数智化闭环

品品香白茶创立于1992年&#xff0c;品牌创立的30多年间&#xff0c;品品香不断创新技术、精耕细作、推陈出新&#xff0c;在不同发展时期始终走在行业前沿&#xff0c;助推着白茶产业高质量发展。 2016年&#xff0c;品品香发挥茶产业龙头示范作用率先进行转型&#xff0c;联…

jmeter中参数加密

加密接口常用的方式有&#xff1a; MD5&#xff0c;SHA&#xff0c;HmacSHA RSA AES&#xff0c;DES&#xff0c;Base64 压测中有些参数需要进行加密&#xff0c;加密方式已接口文档为主。 MD5加密 比如MD5加密的接口文档&#xff1a; 请求URL&#xff1a;http://101.34.221…

免费VPS/云服务器整理汇总

随着互联网的普及和云计算技术的飞速发展&#xff0c;越来越多的人开始尝试使用VPS&#xff08;Virtual Private Server&#xff0c;虚拟专用服务器&#xff09;或者云服务器来部署自己的在线业务。本文将对免费VPS/云服务器进行整理汇总&#xff0c;助力大家轻松开启云计算之旅…

顺应互联网发展大潮流,红河农资招商火爆开启

顺应互联网发展大潮流&#xff0c;红河农资招商火爆开启 进入新世纪&#xff0c;生态农业建设成为了影响和改变农村、农业工作的重要领域。尤其是在互联网的快速发展之下&#xff0c;实现农业结构调整&#xff0c;推动互联网模式的发展&#xff0c;成为了当前生态农业发展的主流…

​python学习之变量类型​

print单纯输中的十种数据类型只需要用print()函数即可&#xff0c;()里面直接写变量名。 下面重点介绍print格式输出&#xff1a; 第一种方法&#xff1a;一个萝卜一个坑&#xff0c;下面的代码中&#xff0c;{0}、{1}、{2}分别表示j,i,j*i&#xff0c;单引号里面是输出格式。…

网络七层模型之表示层:理解网络通信的架构(六)

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 &#x1f35a; 蓝桥云课签约作者、上架课程《Vue.js 和 E…

Python中模块

基本概念 **模块 module&#xff1a;**一般情况下&#xff0c;是一个以.py为后缀的文件 ①Python内置的模块&#xff08;标准库&#xff09;&#xff1b; ②第三方模块&#xff1b; ③自定义模块。 包 package&#xff1a; 当一个文件夹下有 init .py时&#xff0c;意为该文…

构建ELK+Filebeat+kafka+zookeeper大数据日志分析平台

主机IP 角色 所属服务层 部署服务 192.168.11.11 日志生产 采集层 filebeat 192.168.11.12 日志缓存 数据处理层、缓存层 Zookeeperkafkalogstash 192.168.11.13 192.168.11.14 日志展示 持久、检索、展示层 Logstashelasticsearchkibana 数据流向 filebeat--…

工业设备故障诊断解决方案 | 流数据实时采集、存储与回放

工业物联网场景中&#xff0c;故障分析是一个关键环节。设备发生故障时&#xff0c;需快速定位原因。实时采集的流式数据和操作日志记录了设备当前的运行状态&#xff0c;如何根据这些数据快速定位故障发生原因是一个值得研究的问题。DolphinDB 历史数据回放框架为故障分析提供…

极速上架:探索常用的苹果应用商店上架工具,提高应用发布效率

摘要 移动应用app上架是开发者关注的重要环节&#xff0c;但常常会面临审核不通过等问题。为帮助开发者顺利完成上架工作&#xff0c;各种辅助工具应运而生。本文探讨移动应用app上架原理、常见辅助工具功能及其作用&#xff0c;最终指出合理使用工具的重要性。 引言 移动应…

【Vue3进阶】- 第2学堂小商城实战课程前言

该教程为进阶教程&#xff0c;如果你还不了解Vue3的基础知识&#xff0c;可以先前往Vue3基础教程&#xff0c;从入门到实战。 学习时遇到的任何疑问都欢迎在相应课文页面下方的问答区进行提问哦 我能学到什么&#xff1f; 编程写法千千万&#xff0c;实现需求是第一。 教程中…

重塑未来:Web3如何改变我们的数字生活

引言 随着科技的飞速发展&#xff0c;Web3已经成为数字时代的新潮流&#xff0c;其革命性的变革正在渐渐改变着我们的数字生活。本文将深入探讨Web3如何改变我们的数字生活&#xff0c;涉及其意义、应用场景、对未来的影响&#xff0c;以及我们如何适应这一变革&#xff0c;为…

MySQL创建表:练习题

练习题&#xff1a; 创建一个名为"students"的数据库&#xff0c;并切换到该数据库。 在"students"数据库中创建一个名为"grades"的表&#xff0c;包含以下字段&#xff1a; id: 整数类型 name: 字符串类型&#xff0c;学生姓名 subject: 字符串…

linux 环境安装配置

安装java17 1.下载安装包 wget https://download.oracle.com/java/17/latest/jdk-17_linux-x64_bin.tar.gz 2.解压到自定义目录/usr/local/java mkdir /usr/local/java tar zxvf jdk-17_linux-x64_bin.tar.gz -C /usr/local/java 3.配置环境变量 echo export PATH$PATH:/…

在线构建自动部署软件JPOM

系列文章目录 文章目录 系列文章目录前言 前言 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站&#xff0c;这篇文章男女通用&#xff0c;看懂了就去分享给你的码吧。 简而轻的低侵入式在…

八大技术趋势案例(虚拟现实增强现实)

科技巨变,未来已来,八大技术趋势引领数字化时代。信息技术的迅猛发展,深刻改变了我们的生活、工作和生产方式。人工智能、物联网、云计算、大数据、虚拟现实、增强现实、区块链、量子计算等新兴技术在各行各业得到广泛应用,为各个领域带来了新的活力和变革。 为了更好地了解…

没人比小米更懂内卷

小米汽车 昨天晚上雷军终于公布了小米汽车的价格。 发布会直播截图&#xff0c;记住雷总穿着&#xff0c;待会考 标准版&#xff1a;21.59W Pro 版&#xff1a;24.59W Max 版&#xff1a;29.99W 此前外界的普遍预期是 23W~25W&#xff0c;实际公布价格比预期要低 2~4W&#xff…

短视频文案提取的简单实现

过春风十里&#xff0c;尽荠麦青青。春天总是让人舒坦&#xff0c;而今年的三月&#xff0c;也因为与媳妇结婚十年&#xff0c;显得格外不同。两人奢侈的请了一天假&#xff0c;瞒着孩子&#xff0c;重游西湖&#xff0c;去寻找13年前的冰棍店&#xff08;给当时还是同事的她买…

python超详细知识点汇总整理

1、注释以及编码格式的声明 单行注释&#xff1a;# &#xff08;后面放上被注释的内容&#xff09;多行注释&#xff1a;字符段落的上下加上三引号 举个例子: ‘’’ …‘’’编码格式的声明&#xff1a;#coding:utf-8 或者是 #codingutf-8 2、代码编写格式和一些琐碎说明 同…