常见算法思想4:迭代法
迭代法
迭代法也被称为辗转法,是一种不断用变量的旧值递推新值的过程,在解决问题时总是重复利用一种方法。与迭代法相对应的是直接法(或者称为一次解法),即一次性解决问题。迭代法又分为精确迭代和近似迭代。“二分法”和“牛顿迭代法”属于近似迭代法,功能都比较类似。
在使用迭代算法解决问题时,需要做好如下3个方面的工作:
(1)确定迭代变量
在可以使用迭代算法解决的问题中,至少存在一个迭代变量,即直接或间接地不断由旧值递推出新值的变量。
(2)建立迭代关系式
迭代关系式是指如何从变量的前一个值推出其下一个值的公式或关系。通常可以使用递推或倒推的方法来建立迭代关系式,迭代关系式的建立是解决迭代问题的关键。
(3)对迭代过程进行控制
在编写迭代程序时,必须确定在什么时候结束迭代过程,不能让迭代过程无休止地重复执行下去。通常可分为如下两种情况来控制迭代过程:
所需的迭代次数是个确定的值,可以计算出来。可以构建一个固定次数的循环来实现对迭代过程的控制。
所需的迭代次数无法确定,需要进一步分析出用来结束迭代过程的条件。
迭代与递归的区别
从“编程之美”的角度看,可以借用一句非常经典的话:“迭代是人,递归是神!”来从宏观上对二者进行把握。
从概念上讲,递归就是指程序调用自身的编程思想,即一个函数调用本身;迭代是利用已知的变量值,根据递推公式不断演进得到变量新值得编程思想。
从直观上讲,递归是将大问题化为相同结构的小问题,从待求解的问题出发,一直分解到已经已知答案的最小问题为止,然后再逐级返回,从而得到大问题的解(一个非常形象的例子就是分类回归树 classification and regression tree,从root出发,先将root分解为另一个(root,sub-tree),就这样一直分解,直到遇到leafs后逐层返回);而迭代则是从已知值出发,通过递推式,不断更新变量新值,一直到能够解决要求的问题为止。
迭代与递归的转换
理论上递归和迭代可以相互转换,但实际从算法结构来说,递归声明的结构并不总能转换为迭代结构(原因有待研究)。迭代可以转换为递归,但递归不一定能转换为迭代。
递归转迭代
将递归算法转换为非递归算法有两种方法,一种是直接求值(迭代),不需要回溯;另一种是不能直接求值,需要回溯。前者使用一些变量保存中间结果,称为直接转换法,后者使用栈保存中间结果,称为间接转换法。
直接转换法:直接转换法通常用来消除尾递归(tail recursion)和单向递归,将递归结构用迭代结构来替代。(单向递归 → 尾递归 → 迭代)
间接转换法:递归实际上利用了系统堆栈实现自身调用,我们通过使用栈保存中间结果模拟递归过程,将其转为非递归形式。
尾递归函数递归调用返回时正好是函数的结尾,因此递归调用时就不需要保留当前栈帧,可以直接将当前栈帧覆盖掉。
![](/assets/blank.gif)
Go语言描述
还是以斐波那契数列为例吧:
递归方式:
// 递归生成斐波那契数
func Fibonacci(n uint) uint {if n <= 2 {return 1}return Fibonacci(n-1) + Fibonacci(n-2)
}
迭代方式:
// 获取斐波那契数列
func GetFibonacciArray(n int) []int {fArr := make([]int, n+1, n+1) // 数列第一位从下标1开始fArr[1] = 1fArr[2] = 1for i := 3; i <= n; i++ {fArr[i] = fArr[i-1] + fArr[i-2]}return fArr[1:]
}
就以上斐波那契数列的生成为例,尽管递归看起来比较简单,但迭代方式确实比递归方式效率高。
http://www.taodudu.cc/news/show-3718256.html
相关文章:
- 【算法】迭代法
- 迭代算法5——近似迭代法之求一个数的平方根
- 迭代算法6——近似迭代法之二分法
- c语言jacobi迭代法,迭代法解方程:牛顿迭代法、Jacobi迭代法
- 迭代算法2——精确迭代法之十进制转换为二进制
- python算法二:迭代法
- python迭代算法含义_迭代算法原理及其Python编程实现
- 迭代算法7——近似迭代法之牛顿迭代法
- 迭代算法
- 算法--迭代法
- 数据结构与算法之迭代算法
- PLSQL插入自动有创建日期
- Postgres -- 报错: org.postgresql.util.PSQLException: 语法错误 在 “user“ 或附近
- PL/SQL学习笔记(二)—— 执行语句
- PLSQL已建成表后更改列名顺序
- 史上最全PLSQL语法大全
- plsql常用指令
- plsql和mysql的区别6_Oracle数据库和MySQL数据库的区别(原创)
- PLSQL实现分页查询
- Oracle PL/SQL 第三章--运算符与表达式
- PostgreSQL基本数据类型
- PLSQL数据库select语句Day01
- su highgo可能引起的psql报错
- Oracle数据库第四课——PL/SQL中的条件控制
- PLSql 动态SQL应用理解
- PLSQL之动态SQL与异常
- PLSQL——动态SQL、异常(预定义异常、非预定义异常、自定义异常)、引发应用程序错误
- sql注入--布尔盲注
- plsql修改表字段alter
- Oracle笔记之PS/SQL数据库程序设计语言 第一篇
常见算法思想4:迭代法相关推荐
- 常见算法思想——贪心法
常见算法思想--贪心算法 简单介绍 算法定义 详细介绍 算法思想 算法特性 算法使用 算法缺点 算法框架 实例演示 题目描述 题目解析 题目算法 完整代码 简单介绍 算法定义 贪心算法(又称贪婪算法) ...
- 常见算法思想——穷举法
常见算法思想--穷举算法 简单介绍 详细介绍 算法思路 算法特点 算法优化 实例演示 题目描述 题目分析 完整代码 简单介绍 在进行归纳推理时,如果逐个考察了某类事件的所有可能情况,因而得出一般结 ...
- 机器学习常见算法思想的面试宝典
本文转载自机器学习&数据挖掘笔记_16(常见面试之机器学习算法思想简单梳理) 前言: 找工作时(IT行业),除了常见的软件开发以外,机器学习岗位也可以当作是一个选择,不少计算机方向的研究生都会 ...
- 常见算法思想1:枚举法
一.枚举法 枚举算法的思想是:将问题的所有可能的答案一一列举,然后根据条件判断此答案是否合适,保留合适的,丢弃不合适的. 使用枚举算法解题的基本思路如下所示: (1)确定枚举对象.枚举范围和判定条件. ...
- 常见算法思想3:递归法
递归法 在计算机编程应用中,我们常常遇到代码的递归调用,事实上,递归是一种编程技巧,它是分治思想的一种重要体现.递归算法对解决大多数问题是十分有效的,它能够使算法的描述变得简洁而且易于理解. 从直观上 ...
- 常见算法思想2:递推法
递推法 递推算法犹如稳重的有经验的老将,使用"稳扎稳打"的策略,不断利用已有的信息推导出新的东西. 在日常应用中有如下两种递推算法: (1)顺推法:从已知条件出发,逐步推算出要解决 ...
- 软件设计师 - 算法思想
文章目录 递归和迭代 软考常见算法思想 分治法 回溯法 贪心法 动态规划法 递归和迭代 递归:函数不断的调用自己,存在终止条件,分为递推和回归两部分: 迭代:不断用变量的旧值递推新值的过程,当前保存的 ...
- C++不知算法系列之集结常规算法思想
1. 前言 数据结构和算法是程序的 2 大基础结构,如果说数据是程序的汽油,算法则就是程序的发动机. 什么是数据结构? 指数据之间的逻辑关系以及在计算机中的存储方式,数据的存储方式会影响到获取数据的便 ...
- 五大算法思想(三)回溯法及常见例子
文章目录 一.理论基础 1.1 基本策略 1.2 使用步骤 1.3 经典例子 二.常见例子 2.1 八皇后问题 2.2 装载问题 2.3 批量作业调度问题 2.4 背包问题 一.理论基础 回溯法作 ...
最新文章
- Windows下配置scrapy需要MVC的14.0版本(转载)
- MySQL binlog
- Yum编译安装Error Downloading Packages报错
- 初探JavaScript(一)——也谈元素节点、属性节点、文本节点
- linux源码安装必备条件,玩转Linux必备的金钥匙之源码安装mysql
- .net中调用exchange服务器发邮件
- 程序员如何抓住工业互联网风口实现逆袭?
- jboss7体验及配置入门
- [leetcode]1306. 跳跃游戏 III
- 线上收单和线下收单的区别
- windows 无法停止ics_Windows10系统不能启动ICS服务致无法连接WiFi热点的三种解决方法...
- dnfdpl服务器维护了,魔兽世界TBC:地狱火半岛隐藏的“大恐怖”,魔能机甲成双出没!...
- 【猿说VUE】事件处理,Vue奠基之石
- 手机投屏功能说明及开发代码
- 【算法】Sky Map
- PostgreSQL 客户端下查看表,视图,function,切换数据库等
- 【愚公系列】2022年12月 .NET CORE工具案例-性能监控工具WatchDog的使用
- Ubuntu自带的软件制作U盘启动盘
- 远程办公,即将开启企业办公的全新时代!
- shell计算100以内加法
热门文章
- springboot毕设项目校园商品订购平台jql7i(java+VUE+Mybatis+Maven+Mysql)
- 【操作系统】文件管理(七)—— 文件系统的层次结构与基本操作
- vf的device和driver的匹配
- python量化交易心得_Python量化交易之“凯特纳通道”突破策略!
- 东北大学计算机硕士去东软,东软集团软件工程师面试:我是东北大学的,师兄师姐都说东大的进 - 职朋职业圈...
- android手机百度地图开发
- iOS网络缓存扫盲篇 - 使用两行代码就能完成80%的缓存需求
- 号称 GitHub 第一高仿版微信来了
- docker下php的ci模式报yac扩展找不到
- FPGA—VGA 显示器显示彩条(附代码)