迭代和递归的理解和区别

迭代和递归的理解和区别最近做一些题经常会碰到迭代的方法解的,或者递归解法,容易搞混,特在此整理一下一.递归:由例子引出,先看看递归的经典案例都有哪些1.斐波那契数列斐波纳契数列,又称黄金分割数列,指的是这样一个数列:1、1、2、3、5、8、13、21、……这个数列从第三项开始,每一项都等于前两项之和。2.阶乘n!=n*(n-1)*(n-2)*…*1(n>0)3.汉诺塔问…

大家好,又见面了,我是你们的朋友全栈君。

最近做一些题经常会碰到迭代的方法解的,或者递归解法,容易搞混,特在此整理一下
一.递归:
由例子引出,先看看递归的经典案例都有哪些
1.斐波那契数列
斐波纳契数列,又称黄金分割数列,指的是这样一个数列:1、1、2、3、5、8、13、21、……
这个数列从第三项开始,每一项都等于前两项之和。
2.
阶乘 n! = n * (n-1) * (n-2) * …* 1(n>0)
3.汉诺塔问题
在这里插入图片描述
4.全排列
从n个不同元素中任取m(m≤n)个元素,按照一定的顺序排列起来,叫做从n个不同元素中取出m个元素的一个排列。当m=n时所有的排列情况叫全排列。
如1,2,3三个元素的全排列为:
1,2,3
1,3,2
2,1,3
2,3,1
3,1,2
3,2,1
5. 两张有意思的图
在这里插入图片描述
在这里插入图片描述
现在就算说不出定义也能理解什么是递归了

在这里插入图片描述
递归到底是个啥

递归,就是在运行的过程中调用自己。
构成递归需具备的条件:

1. 子问题须与原始问题为同样的事,且更为简单;
2. 不能无限制地调用本身,须有个出口,化简为非递归状况处理。

二.迭代
迭代的经典例子
1.斐波那契数列(没错,又是我)
2.汉诺塔问题(这不巧了么)
3.背包问题
有N件物品和一个容量为V的背包。第i件物品的重量是w[i],价值是v[i]。求解将哪些物品装入背包可使这些物品的重量总和不超过背包容量,且价值总和最大。基本思路
这是最基础的背包问题,特点是:每种物品仅有一件,可以选择放或不放。
用子问题定义状态:即f[i][v]表示前i件物品恰放入一个容量为v的背包可以获得的最大价值。则其状态转移方程便是:
f[i][v]=max{ f[i-1][v], f[i-1][v-w[i]]+v[i] }。
可以压缩空间,f[v]=max{f[v],f[v-w[i]]+v[i]}
这个方程非常重要,基本上所有跟背包相关的问题的方程都是由它衍生出来的。所以有必要将它详细解释一下:“将前i件物品放入容量为v的背包中”这个子问题,若只考虑第i件物品的策略(放或不放),那么就可以转化为一个只牵扯前i-1件物品的问题。如果不放第i件物品,那么问题就转化为“前i-1件物品放入容量为v的背包中”,价值为f[i-1][v];如果放第i件物品,那么问题就转化为“前i-1件物品放入剩下的容量为v-w[i]的背包中”,此时能获得的最大价值就是f [i-1][v-w[i]]再加上通过放入第i件物品获得的价值v[i]。
注意f[v]有意义当且仅当存在一个前i件物品的子集,其费用总和为f[v]。所以按照这个方程递推完毕后,最终的答案并不一定是f[N] [V],而是f[N][0…V]的最大值。如果将状态的定义中的“恰”字去掉,在转移方程中就要再加入一项f[v-1],这样就可以保证f[N] [V]就是最后的答案。
同样的例子,做法不同,也就有了不同的定义
迭代法也称辗转法,是一种不断用变量的旧值递推新值的过程,跟迭代法相对应的是直接法(或者称为一次解法),即一次性解决问题。

迭代和递归的关系和区别(敲黑板)
从概念上讲,递归就是指程序调用自身的编程思想,即一个函数调用本身;迭代是利用已知的变量值,根据递推公式不断演进得到变量新值得编程思想。简单地说,递归是重复调用函数自身实现循环。迭代是函数内某段代码实现循环,而迭代与普通循环的区别是:循环代码中参与运算的变量同时是保存结果的变量,当前保存的结果作为下一次循环计算的初始值。
迭代与普通循环的区别是:迭代时,循环代码中参与运算的变量同时是保存结果的变量,当前保存的结果作为下一次循环计算的初始值。
递归与普通循环的区别是:循环是有去无回,而递归则是有去有回(因为存在终止条件)
在循环的次数较大的时候,迭代的效率明显高于递归。
以斐波那契数列的求解为例,通过两种典型的实现进行对比:
递归的实现

int fib(int n){  
         if(n>1) return fib(n-1) + fib(n-2);  
         else return n; // n = 0, 1时给出recursion终止条件  
    }  

迭代

int fib(int n){  
    int i, temp0, temp1, temp2;        
    if(n<=1) return n;  
    temp1 = 0;  
    temp2 = 1;  
    for(i = 2; i <= n; i++){  
        temp0 = temp1 + temp2;  
        temp2 = temp1;  
        temp1 = temp0;  
    }  
    return temp0;  
} 
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/134775.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • python爬虫 完整代码

    python爬虫 完整代码这里写自定义目录标题欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML图表FLowchart流程图导出与导入导出导入欢迎使用Markdown编辑器你好!这是你第一次使用Markdown编辑器所展示的欢迎页。如果你想学习如何使用Mar

    2022年6月6日
    49
  • 分布式 mybatis-plus 逻辑删除不生效 升级后org.mybatis.logging.LoggerFactory报错[通俗易懂]

    分布式 mybatis-plus 逻辑删除不生效 升级后org.mybatis.logging.LoggerFactory报错[通俗易懂]解决方案:第一步:升级mybatisplus版本到3.2.0第二步.多添加一个扩展包<dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-extension</artifactId&gt…

    2022年6月2日
    58
  • 罗技g933使用教程_罗技键盘如何连接电脑

    罗技g933使用教程_罗技键盘如何连接电脑罗技K380蓝牙键盘是罗技比较经典的一款外设产品,最近,罗技新推出了k380芍药白和茱萸粉两种新配色,让我们来一起看一下。其中粉色介于粉色和裸色之间,相比粉色增加了一丝灰色。极客之选本次拿到的是白色版本,颜色也非亮白,而是与粉色类似较柔和,两种颜色整体都非常素雅,因此也适合在各种场合使用。外观上,罗技K380延续了一贯的设计风格,圆润的边框设计配合圆形按键,整体看起来非常小巧精致,不同…

    2022年10月16日
    1
  • NV12格式介绍[通俗易懂]

    NV12格式介绍[通俗易懂]YV12和NV12都是YUV420平面格式中的一种,其中YV12格式在我所接触的项目中使用得比较多,而NV12是Intel制定的的格式,在Intel的平台显示和支持性能最值,NV12是用于DirectXVA的首选4:2:0像素格式。  关于YV12和NV12的内存布局格式说明如下:1.YV12格式内存布局为2.NV12格式内存布局为3…

    2025年11月21日
    4
  • Java面向对象三大特性详解「建议收藏」

    Java面向对象三大特性详解「建议收藏」一、封装1、概念:将类的某些信息隐藏在类内部,不允许外部程序直接访问,而是通过该类提供的方法来实现对隐藏信息的操作和访问。2、好处:只能通过规定的方法访问数据。 隐藏类的实例细节,方便修改和实现。3、封装的实现步骤     需要注意:对封装的属性不一定要通过get/set方法,其他方法也可以对封装的属性进行操作。当然最好使用get/set方法,比较标准。A、访问修饰…

    2022年7月25日
    8
  • java写一个冒泡排序_冒泡排序 一个java例程

    java写一个冒泡排序_冒泡排序 一个java例程冒泡排序的算法的思想其实很简单就是逐个比较交换位次从而实现一个完整的排序,下面直接看代码吧。packagealgorithm;importjava.text.SimpleDateFormat;importjava.util.Date;/**时间:2019822*作者:latefly*功能:一个冒泡排序的展示,包含一个原始的方法以及一个优化以后的方法****/publicclass…

    2022年7月7日
    23

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号