• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >数据结构 > 迭代算法与递归算法的概念及区别

迭代算法与递归算法的概念及区别

作者:匿名 字体:[增加 减小] 来源:互联网 时间:2017-06-28

匿名通过本文主要向大家介绍了迭代算法,matlab迭代算法程序,matlab迭代算法,信道容量的迭代算法,牛顿迭代算法等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com
</div>

迭代算法是用计算机解决问题的一种基本方法。它利用计算机运算速度快、适合做重复性操作的特点,让计算机对一组指令(或一定步骤)进行重复执行,在每次执行这组指令(或这些步骤)时,都从变量的原值推出它的一个新值。

利用迭代算法解决问题,需要做好以下三个方面的工作:

一、确定迭代变量。在可以用迭代算法解决的问题中,至少存在一个直接或间接地不断由旧值递推出新值的变量,这个变量就是迭代变量。

二、建立迭代关系式。所谓迭代关系式,指如何从变量的前一个值推出其下一个值的公式(或关系)。迭代关系式的建立是解决迭代问题的关键,通常可以使用递推或倒推的方法来完成。

三、对迭代过程进行控制。在什么时候结束迭代过程?这是编写迭代程序必须考虑的问题。不能让迭代过程无休止地重复执行下去。迭代过程的控制通常可分为两种情况:一种是所需的迭代次数是个确定的值,可以计算出来;另一种是所需的迭代次数无法确定。对于前一种情况,可以构建一个固定次数的循环来实现对迭代过程的控制;对于后一种情况,需要进一步分析出用来结束迭代过程的条件。

例 1 : 一个饲养场引进一只刚出生的新品种兔子,这种兔子从出生的下一个月开始,每月新生一只兔子,新生的兔子也如此繁殖。如果所有的兔子都不死去,问到第 12 个月时,该饲养场共有兔子多少只?

分析: 这是一个典型的递推问题。我们不妨假设第 1 个月时兔子的只数为 u 1 ,第 2 个月时兔子的只数为 u 2 ,第 3 个月时兔子的只数为 u 3 ,……根据题意,“这种兔子从出生的下一个月开始,每月新生一只兔子”,则有

以下是引用片段:
u1=1,u2=u1+u1×1=2,u3=u2+u2×1=4,……
  根据这个规律,可以归纳出下面的递推公式:
以下是引用片段:
  un=un-1×2(n≥2)
  对应 u n 和 u n - 1 ,定义两个迭代变量 y 和 x ,可将上面的递推公式转换成如下迭代关系:

以下是引用片段:
  y=x*2
  x=y
  让计算机对这个迭代关系重复执行 11 次,就可以算出第 12 个月时的兔子数。参考程序如下:

以下是引用片段:
  cls
  x=1
  fori=2to12
  y=x*2
  x=y
  nexti
  printy
  end
  例 2 : 阿米巴用简单分裂的方式繁殖,它每分裂一次要用 3 分钟。将若干个阿米巴放在一个盛满营养参液的容器内, 45 分钟后容器内充满了阿米巴。已知容器最多可以装阿米巴 2 20 个。试问,开始的时候往容器内放了多少个阿米巴?请编程序算出。

分析: 根据题意,阿米巴每 3 分钟分裂一次,那么从开始的时候将阿米巴放入容器里面,到 45 分钟后充满容器,需要分裂 45/3=15 次。而“容器最多可以装阿米巴 2 20 个”,即阿米巴分裂 15 次以后得到的个数是 2 20 。题目要求我们计算分裂之前的阿米巴数,不妨使用倒推的方法,从第 15 次分裂之后的 2 20 个,倒推出第 15 次分裂之前(即第 14 次分裂之后)的个数,再进一步倒推出第 13 次分裂之后、第 12 次分裂之后、……第 1 次分裂之前的个数。

设第 1 次分裂之前的个数为 x 0 、第 1 次分裂之后的个数为 x 1 、第 2 次分裂之后的个数为 x 2 、……第 15 次分裂之后的个数为 x 15 ,则有

以下是引用片段:
  x14=x15/2、x13=x14/2、……xn-1=xn/2(n≥1)
  因为第 15 次分裂之后的个数 x 15 是已知的,如果定义迭代变量为 x ,则可以将上面的倒推公式转换成如下的迭代公式:
  x=x/2 ( x 的初值为第 15 次分裂之后的个数 2 20 )

让这个迭代公式重复执行 15 次,就可以倒推出第 1 次分裂之前的阿米巴个数。因为所需的迭代次数是个确定的值,我们可以使用一个固定次数的循环来实现对迭代过程的控制。参考程序如下:

以下是引用片段:
  cls
  x=2^20
  fori=1to15
  x=x/2
  nexti
  printx
  end
  例 3 : 验证谷角猜想。日本数学家谷角静夫在研究自然数时发现了一个奇怪现象:对于任意一个自然数 n ,若 n 为偶数,则将其除以 2 ;若 n 为奇数,则将其乘以 3 ,然后再加 1 。如此经过有限次运算后,总可以得到自然数 1 。人们把谷角静夫的这一发现叫做“谷角猜想”。

要求:编写一个程序,由键盘输入一个自然数 n ,把 n 经过有限次运算后,最终变成自然数 1 的全过程打印出来。

分析: 定义迭代变量为 n ,按照谷角猜想的内容,可以得到两种情况下的迭代关系式:当 n 为偶数时, n=n/2 ;当 n 为奇数时, n=n*3+1 。用 QBASIC 语言把它描述出来就是:

以下是引用片段:
  ifn为偶数then
  n=n/2
  else
  n=n*3+1
  endif
  这就是需要计算机重复执行的迭代过程。这个迭代过程需要重复执行多少次,才能使迭代变量 n 最终变成自然数 1 ,这是我们无法计算出来的。因此,还需进一步确定用来结束迭代过程的条件。仔细分析题目要求,不难看出,对任意给定的一个自然数 n ,只要经过有限次运算后,能够得到自然数 1 ,就已经完成了验证工作。因此,用来结束迭代过程的条件可以定义为: n=1 。参考程序如下:

以下是引用片段:
  cls
  input"Pleaseinputn=";n
  dountiln=1
  ifnmod2=0then
  rem如果n为偶数,则调用迭代公式n=n/2
  n=n/2
  print"—";n;
  else
  n=n*3+1
  print"—";n;
  endif
  loop
  end
  迭代法
  迭代法是用于求方程或方程组近似根的一种常用的算法设计方法。设方程为f(x)=0,用某种数学方法导出等价的形式x=g(x),然后按以下步骤执行:

(1) 选一个方程的近似根,赋给变量x0;

(2) 将x0的值保存于变量x1,然后计算g(x1),并将结果存于变量x0;

(3) 当x0与x1的差的绝对值还小于指定的精度要求时,重复步骤(2)的计算。

若方程有根,并且用上述方法计算出来的近似根序列收敛,则按上述方法求得的x0就认为是方程的根。上述算法用C程序的形式表示为:

【算法】迭代法求方程的根

以下是引用片段:
  {x0=初始近似根;
  do{
  x1=x0;
  x0=g(x1);/*按特定的方程计算新的近似根*/
  }while(fabs(x0-x1)>Epsilon);
  printf(“方程的近似根是%f
”,x0);
  }
  迭代算法也常用于求方程组的根,令

X=(x0,x1,…,xn-1)

设方程组为:

xi=gi(X) (I=0,1,…,n-1)

则求方程组根的迭代算法可描述如下:

【算法】迭代法求方程组的根

以下是引用片段:
  {for(i=0;i
  x=初始近似根;
  do{
  for(i=0;i
  y=x;
  for(i=0;i
  x=gi(X);
  for(delta=0.0,i=0;i
  if(fabs(y-x)>delta)delta=fabs(y-x);
  }while(delta>Epsilon);
  for(i=0;i
  printf(“变量x[%d]的近似根是%f”,I,x);
  printf(“
”);
  }
  具体使用迭代法求根时应注意以下两种可能发生的情况:

(1) 如果方程无解,算法求出的近似根序列就不会收敛,迭代过程会变成死循环,因此在使用迭代算法前应先考察方程是否有解,并在程序中对迭代的次数给予限制;

(2) 方程虽然有解,但迭代公式选择不当,或迭代的初始近似根选择不合理,也会导致迭代失败。

 2 3 4  下一页</div> </div> </div> </div> </div>
分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • 迭代算法与递归算法的概念及区别

相关文章

  • 2017-06-28N皇后问题摆法算法描述
  • 2017-06-28数据结构教程 第三十七课 实验八 排序实验
  • 2017-06-28数据结构教程 第二十七课 实验六 二叉树实验
  • 2017-06-28数据结构教程 第三十课 静态查找表(二)有序表的查找
  • 2017-06-28数据结构C语言实现之线性表
  • 2017-06-28数据结构教程 第二十八课 图的存储结构
  • 2017-06-28数据结构教程 第三十八课 文件概念、顺序文件
  • 2017-06-28数据结构教程 第七课 实验一 线性表的顺序存储实验
  • 2017-06-28J2ME中的基础碰撞检测算法浅析
  • 2017-06-28数据结构教程 第三十五课 实验七 查找

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • UVa1584 环状序列 (Circular Sequence)
    • 链表的建立、插入和删除
    • 数据结构教程 第五课 线性表的类型定义
    • 数据结构教程 第三十七课 实验八 排序实验
    • 算法学习之旅,初级篇(30)-–删除链表内节点
    • 数据结构C语言实现之线性表
    • 【一步步学OpenGL26】-《法线贴图》
    • 倒叙打印链表
    • 数据结构教程 第六课 线性表的顺序表示和实现
    • 数据结构教程 第十九课 实验四 串的实现实验

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有