最近做一些题经常会碰到迭代的方法解的,或者递归解法,容易搞混,特在此整理一下
一.递归:
由例子引出,先看看递归的经典案例都有哪些
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;
}

迭代和递归的理解和区别相关推荐

  1. 迭代和递归的关系和区别

    迭代和递归的关系和区别(敲黑板) 从概念上讲,递归就是指程序调用自身的编程思想,即一个函数调用本身:迭代是利用已知的变量值,根据递推公式不断演进得到变量新值的编程思想.简单地说,递归是重复调用函数自身 ...

  2. 【思维风暴】算法迭代和递归的理解

    文章目录 递归与迭代 递归消耗内存的缺点 为什么要有迭代 需要用迭代消解递归的情况 不需要消解的递归 结束语 递归与迭代 递归与迭代都是基于控制结构:迭代用重复结构,而递归用选择结构.递归与迭代都涉及 ...

  3. 一次看懂迭代与递归的区别

    文章目录 前言 一.介绍概念 二.总结 前言 偶然看到了迭代与递归,抱着学习的心态去百度了各种答案,什么函数关系什么代码看的是一头雾水,于是在半个小时的努力下终于搞懂了递归与迭代的区别,在这里分享给各 ...

  4. 关于函数递归和函数迭代,我的理解

    在C语言里函数递归是什么呢?我的理解是函数自己调用自己,但是不能一直调用,有限制条件,当满足限制条件后,函数停止调用.说到这我就想说一下我对函数的理解,函数我理解为实现某种功能的一串代码,由于函数讲究 ...

  5. python递归和循环的区别_Python递归与迭代

    1.递归与迭代: 递归和迭代都是循环的一种.简单地说,递归是重复调用函数自身实现循环.迭代是函数内某段代码实现循环,而迭代与普通循环的区别是:循环代码中参与运算的变量同时是保存结果的变量,当前保存的结 ...

  6. Java中的迭代与递归

    递归 提到迭代,不得不提一个数学表达式: n!=n*(n-1)*(n-2)*...*1 有很多方法来计算阶乘.有一定数学基础的人都知道n!=n*(n-1)!因此,代码的实现可以直接写成: 代码一 in ...

  7. 递归和尾递归的区别和原理

    递归和尾递归的区别和实现 基本上大多数C的入门教材里都会说简单的递归,例如求阶乘n!,经典的本科入门书籍谭浩强的<C语言程序设计>,但后来看了<代码大全2>这本书,关于进阶和编 ...

  8. 递归和迭代_迭代与递归

    很多编程小白都会遇到'迭代'和'递归'的问题(包括我自己),大部分同学还是不知道迭代与递归的区别.下面我就尝试用最通俗易懂的模式讲解递归与迭代的区别. 1.迭代: 迭代其实很简单,我们在编程中经常用到 ...

  9. 斐波那契数的两种求法(迭代,递归)

    **斐波那契数,通常用 F(n) 表示,形成的序列称为斐波那契数列.该数列由 0 和 1 开始,后面的每一项数字都是前面两项数字的和.也就是: F(0) = 0, F(1) = 1 F(N) = F( ...

最新文章

  1. vmware tools安装程序无法继续,Microsoft Runtime DLL安装程序未能完成安装。的解决方法
  2. [C++] this指针
  3. Javascript 事件propagation机制
  4. kafka简介(大数据技术)
  5. 大数据_Hbase-API访问_Java操作Hbase_封装操作数据的工具类---Hbase工作笔记0015
  6. 【下载https协议需要的cer证书】
  7. maven配置阿里仓库
  8. LDAP——实现用户统一登录管理
  9. Java对AutoCad二次开发
  10. 【零基础一起学习FPS游戏Unity3D手机游戏开发】第1章 准备工作
  11. Network--名词解释
  12. python最佳缝合线(Image Stitching 2)
  13. 选课系统源码html,高校选课系统 - WEB源码|源代码 - 源码中国
  14. 新南威尔士大学计算机博士申请,2020年新南威尔士大学博士申请时间
  15. java.sql.SQLException: 要执行的 SQL 语句不得为空白或空值
  16. @Resource和@Autowired的区别
  17. 微信小程序工具的使用及其参数含义。
  18. 解决nexus 6p 无限重启的问题。nexus 6p 刷入twrp,magisk
  19. 基于Andriod的连锁药店管理系统-计算机毕业设计源码+LW文档
  20. 以数字技术推动行业跃迁,容联云抢先迈进云联络中心智能化阶段

热门文章

  1. word2vec中的skipgram和CBOW的比较
  2. H5视频播放器开发-画中画
  3. 虚拟机服务器操作-磁盘配额
  4. 学习笔记:《Foundation models for generalist medical artificial intelligence》
  5. C++11-decltype类型
  6. 出局者高调给小程序泼冷水 为什么说2019年的小程序仍是大有可为?
  7. div absolute 居中
  8. 抖音四面被拒,再战头条终获offer,全套教学资料
  9. 官网下载eclipse出现mirror.kakao.com 的响应时间过长+解决方法
  10. 前后端开发-springboot项目/java搭配vue获取谷歌验证码