算法基础--递归与回溯、递推、迭代关系

2023-10-31

递归的优缺点

优点:代码更简洁清晰,可读性更好
实际上递归的代码更清晰,但是从学习的角度要理解递归真正发生的什么,是如何调用的,调用层次和路线,调用堆栈中保存了什么,可能是不容易。但是不可否认递归的代码更简洁。
缺点:由于递归需要系统堆栈,所以空间消耗要比非递归代码要大很多.而且,如果递归深度太大,可能会造成栈溢出
在这里插入图片描述

递归,递推,迭代什么关系

递归
详见《递归那些事一》
1、递归分为两个阶段:
1)递推:把复杂的问题的求解推到比原问题简单一些的问题的求解;(递推更多是数学概念,也就是需要找出问题的规律,不必深究)
2)回归:当获得最简单的情况后, 逐步返回, 依次得到复杂的解.

//递归法求第n个数的斐波那契数列

long factorial(int n)
{
if(n<=2)
return 1;
if(n > 1)
return factorial(n - 2) +factorial(n - 1);
}

//递归法计算n的阶乘

long factorial(int n)
{
if (n <= 0)
return 1;
else
return n*factorial(n - 1);
}

迭代:

1、利用变量的原值推算出变量的一个新值.如果递归是自己调用自己的话,
迭代就是A不停的调用B
2、优点:
1)迭代效率高,运行时间只因循环次数增加而增加;
2)没什么额外开销,空间上也没有什么增加;
3、缺点:
1) 不容易理解;
2) 代码不如递归简洁;
3) 编写复杂问题时困难。

注意: 能用迭代的不用递归,递归调用函数,浪费空间,并且递归太深容易造成堆栈的溢出

//迭代法计算n的阶乘

long factorial(int n)
{
int result = 1;
while (n > 1)
{
result *= n;
n -= 1;
}
result;
}

递推:

1、递推算法是一种简单的算法,即通过已知条件,利用特定关系得出中间推论,直至得到结果的算法。递推算法分为顺推和逆推两种。(其实和动归接近的)
2、相对于递归算法,递推算法免除了数据进出栈的过程,也就是说,不需要函数不断的向边界值靠拢,而直接从边界出发,直到求出函数值。

#define size 20
int main()
{
//循环法
int arr[size];
arr[0] = 0;
arr[1] = 1;
for (int i = 0; i <= size; i++)
{
if (i>1)
arr[i] = arr[i - 2] + arr[i - 1];//递推算法
printf("factorial[%d]=%d\n", i, arr[i]);
}
system("pause");
return 0;
}

递归的优化方法

递归问题中想到思路本身不非常难,真正的难点在于如何优化。
1、考虑是否重复计算
如果你使用递归的时候不进行优化,是有非常非常非常多的子问题被重复计算的。因此,使用递归的时候,必要须要考虑有没有重复计算,如果重复计算了,一定要把计算过的状态保存起来。
2、考虑尾递归
对于递归的问题,我们一般都是从上往下递归的,直到递归到最底,再一层一层着把值返回。

不过,有时候当 n 比较大的时候,例如当 n = 10000 时,那么必须要往下递归10000层直到 n <=1 才将结果慢慢返回,如果n太大的话,可能栈空间会不够用。这个时候,就可以用尾递归优化来解决。

顾名思义,尾递归就是从最后开始计算, 每递归一次就算出相应的结果, 也就是说, 函数调用出现在调用者函数的尾部, 因为是尾部, 所以根本没有必要去保存任何局部变量。直接让被调用的函数返回时越过调用者, 返回到调用者的调用者去。
在这里插入图片描述

更多练习题目

1、机器人走方格V6
2、分解因数
3、K之字符是A还是B

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

算法基础--递归与回溯、递推、迭代关系 的相关文章

  • 代理IP与Socks5代理

    一代理IP 多地区数据采集的智能引擎 多地区市场了解 代理IP允许爬虫模拟多个地区的IP地址 实现对不同市场的数据采集 这为跨界电商深入了解不同地区需求 趋势提供了数据基础 规避反爬虫策略 许多网站采用反爬虫技术 限制频繁访问 代理IP通过
  • JavaWeb的Servlet的两种配置

    Servlet接口 要成为一个Servlet 需要实现Servlet接口 为了方便 可以继承HttpServlet HttpServlet实现了Servlet接口 Servlet生命周期 在Tomcat中Servlet是单例的 Servle
  • 如何使用Docker创建自定义网络

    目录 网络模式 1 bridge模式 默认模式 桥接模式 初识网络模式 查看桥接模式的特点 2 host模式 仅主机模式 使用守护进程的方式创建并启动且进入容器 查看仅主机模式下的网络配置 端口映射 3 如何创建自定义网络 网络模式 Doc

随机推荐

  • Unity3D 选中高亮效果shader的实现

    实现思路 平时我们可能觉得shader就是单纯用来进行渲染的 不会和逻辑代码产生什么交互 但是如果要做这种高亮的效果就需要使用代码来控制shader的显示了 所以物体选中高亮效果的实现其实就很简单 先写一个shader表现高亮效果 然后用另
  • Mybatis 学习笔记02 - CRUD

    目录 1 添加操作 1 1 在 UserDao 接口中新增 saveUser 方法 1 2 在映射配置文件 UserMapper xml 中配置添加操作 1 3 测试添加用户 1 4 测试结果 2 更新操作 2 1 在 UserDao 接口
  • FAST-LIO(二):程序运行&代码注释

    文章目录 前言 数据准备 程序运行 代码注释 1 laserMapping cpp 2 IMU Processing hpp 3 use ikfom hpp 前言 论文题目 FAST LIO A Fast Robust LiDAR iner
  • vue页面缓存解决方案

    关于vue页面通过解决方案 方案一 使用keep alive和v if 备注 这种方案有问题 关闭面板后 在通过菜单打开页面还是有缓存 1 添加keep alive
  • pycharm 怎么使用快捷键按出代码提示框

    更新win10 发现可以改取消ctrl space快捷键的占用了 我们在平时写代码的时候难免会出现敲错字母的时候 这时候你的代码提示框就会消失 很不爽 但你退格删掉错的字母的时候 代码提示框还是没有自动出现 就很烦 不想写代码了 其实都是w
  • 谈谈自己对IOC容器的理解(一)

    初学Java时 了解到Java是一门面向对象的语言 我感觉Java这面向对象好废 啥都要我自己弄 这跟C语言有啥区别 感觉Java也就这样了 完全体会不到面向对象的感觉 处处都是 面向过程 网上总说面向对象修房子是去找专门修房子的人来修 面
  • 安卓依赖冲突处理

    目录 一 模块依赖 二 打包时如何处理依赖 三 为什么依赖重复后会有报错 最后 一 模块依赖 这里引用一下谷歌链接 https developer android com studio build dependencies google m
  • 大话数据结构 2 算法

    算法 算法是解决特定问题求解步骤的描述 在计算机中表现为指令的有限序列 并且每条指令表示一个或多个操作 算法的五个基本特性 输入 输出 有穷性 确定性 可行性 1 输入输出 算法具有0个或多个输入 算法至少有1个或多个输出 2 有穷性 指算
  • 基于QT绘制可交互性的Bezier曲线

    前言 因为项目需要 要做一款类似AI里面的曲率工具出来 其实也类似Photoshop里面的钢笔工具 所以写了个demo来演练一番 之前是不懂Bezier的 但是网上找到的源码都是固定点的 但无论是钢笔工具还是曲率工具都是要能与鼠标键盘交互的
  • Node.js之高性能探秘

    Node js之高性能探秘 NodeJS是什么 简介 NodeJS的优点 一 对前端工程师友好 二 高性能 高性能的实现 单线程 非阻塞异步I O 事件驱动 事件循环机制 NodeJS是什么 简介 Node js是一个开源和跨平台的基于 C
  • matlab算法_决策树算法MATLAB实践

    在MATLAB中 为方便用户对决策树算法的使用 MATLAB中针对分类决策树和回归决策树分别封装了两个函数 fitctree和fitrtree 由于分类决策树和回归决策树两者具有极大的相似性 因此fitctree和fitrtree两者的使用
  • 我的世界java版tp_神奇的tp指令 我的世界tp指令的用法

    神奇的tp指令 我的世界tp指令的用法 tp指令是每个玩服务器的玩家都要了解和掌握的一个指令 那下面游戏园小编就给大家详细的介绍一下在我的世界中tp指令要怎么使用吧 希望大家喜欢 其实是运用到了指令之中的tp指令 tp 自己的名字 坐标 O
  • 走梅花桩步数

    题目描述 题目描述 Redraiment是走梅花桩的高手 Redraiment总是起点不限 从前到后 往高的桩子走 但走的步数最多 不知道为什么 你能替Redraiment研究他最多走的步数吗 样例输入 6 2 5 1 5 4 5 样例输出
  • 使用微信小程序连接到 MQTT 云服务

    微信小程序是腾讯于 2017 年 1 月 9 日推出的一种不需要下载安装即可在微信平台上使用的应用程序 用户扫一扫或者搜一下即可打开应用 也体现了 用完即走 的理念 用户不用关心是否安装太多应用的问题 应用将无处不在 随时可用 但又无需安装
  • input-file 部分手机不能拍照问题

    曾经遇到一个需求 用户拍身份证上传验证 然后我卡在了拍照这个点上 最初采用的是微信的 api wx chooseImage 但随后发现 返回的是一种只有微信才能预览的 url 格式 但验证是要放在 PC 上进行的 等于保存了这个 url 也
  • uniapp省市区3级联动组件

    1 组件代码picker region vue
  • CDN 内容分发网络

    第一步 HTML的文件引用 HTML的文件头 也有文件中 文件尾 那边常有其他文件引用 比如CSS以及JS的引用 就以bootstrap常用的引用来举个栗子 你常见的引用可能会是这样的
  • MVN Scope属性说明

    MVN 的Scope属性包括 compile 默认配置 provided runtime system test compile compile是默认的范围 如果没有提供一个范围 那该依赖的范围就是编译范围 编译范围依赖在所有的classp
  • Web前端复习——Javascript(1)

    1 js发展进程关键词 ECMAScript标准 定义了js语言的核心语法 Netscape 遵照标准 实现了Javascript语言 Microsoft 遵照标准 实现了JSscript标准 W3C DOM标准 专门操作网页内容的标准 所
  • 算法基础--递归与回溯、递推、迭代关系

    递归的优缺点 优点 代码更简洁清晰 可读性更好 实际上递归的代码更清晰 但是从学习的角度要理解递归真正发生的什么 是如何调用的 调用层次和路线 调用堆栈中保存了什么 可能是不容易 但是不可否认递归的代码更简洁 缺点 由于递归需要系统堆栈 所