递归与迭代区别和迭代的区别是什么,各有什么优缺点

迭代和递归区别请问迭代和递归的最大区别是不是静_百度知道
迭代和递归区别请问迭代和递归的最大区别是不是静
我有更好的答案
系统开销很大。二者的联系:在一些情况下(尾递归),递归可以简单地转换成迭代,就是几个变量来回赋值;而递归需要大量的函数调用我觉得关键区别在二者的开销:迭代操作的开销比较小。转不成迭代的复杂情况一般需要自己构造栈来模拟函数调用过程,从而减少系统开销
采纳率:89%
来自团队:
为您推荐:
其他类似问题
换一换
回答问题,赢新手礼包
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。他的最新文章
他的热门文章
您举报文章:
举报原因:
原文地址:
原因补充:
(最多只允许输入30个字)http://blog.csdn.net/laoyang360/article/details/7855860
http://www.zhihu.com/question/
深究递归和迭代的区别、联系、优缺点及实例对比
1.概念区分
递归的基本概念:程序调用自身的编程技巧称为递归,是函数自己调用自己.
一个函数在其定义中直接或间接调用自身的一种方法,它通常把一个大型的复杂的问题转化为一个与原问题相似的规模较小的问题来解决,可以极大的减少代码量.递归的能力在于用有限的语句来定义对象的无限集合.
使用递归要注意的有两点:
1)递归就是在过程或函数里面调用自身;
2)在使用递归时,必须有一个明确的递归结束条件,称为递归出口.
递归分为两个阶段:
1)递推:把复杂的问题的求解推到比原问题简单一些的问题的求解;
2)回归:当获得最简单的情况后,逐步返回,依次得到复杂的解.
利用递归可以解决很多问题:如背包问题,汉诺塔问题,...等.
斐波那契数列为:0,1,1,2,3,5...
由于递归引起一系列的函数调用,并且有可能会有一系列的重复计算,递归算法的执行效率相对较低.
迭代:利用变量的原值推算出变量的一个新值.如果递归是自己调用自己的话,迭代就是A不停的调用B.
2.辩证看递归和迭代
所谓递归,简而言之就是应用程序自身调用自身,以实现层次数据结构的查询和访问。递归的使用可以使代码更简洁清晰,可读性更好(对于初学者到不见得),但由于递归需要系统堆栈,所以空间消耗要比非递归代码要大很多,而且,如果递归深度太大,可能系统资源会不够用。
往往有这样的观点:能不用递归就不用递归,递归都可以用迭代来代替。
诚然,在理论上,递归和迭代在时间复杂度方面是等价的(在不考虑函数调用开销和函数调用产生的堆栈开销),但实际上递归确实效率比迭代低,既然这样,递归没有任何优势,那么是不是就,没有使用递归的必要了,那递归的存在有何意义呢?
万物的存在是需要时间的检验的,递归没有被历史所埋没,即有存在的理由。从理论上说,所有的递归函数都可以转换为迭代函数,反之亦然,然而代价通常都是比较高的。但从算法结构来说,递归声明的结构并不总能够转换为迭代结构,原因在于结构的引申本身属于递归的概念,用迭代的方法在设计初期根本无法实现,这就像动多态的东西并不总是可以用静多态的方法实现一样。这也是为什么在结构设计时,通常采用递归的方式而不是采用迭代的方式的原因,一个极典型的例子类似于链表,使用递归定义及其简单,但对于内存定义(数组方式)其定义及调用处理说明就变得很晦涩,尤其是在遇到环链、图、网格等问题时,使用迭代方式从描述到实现上都变得不现实。因而可以从实际上说,所有的迭代可以转换为递归,但递归不一定可以转换为迭代。
采用递归算法需要的前提条件是,当且仅当一个存在预期的收敛时,才可采用递归算法,否则,就不能使用递归算法。
递归其实是方便了程序员难为了机器,递归可以通过数学公式很方便的转换为程序。其优点就是易理解,容易编程。但递归是用栈机制实现的,每深入一层,都要占去一块栈数据区域,对嵌套层数深的一些算法,递归会力不从心,空间上会以内存崩溃而告终,而且递归也带来了大量的函数调用,这也有许多额外的时间开销。所以在深度大时,它的时空性就不好了。
而迭代虽然效率高,运行时间只因循环次数增加而增加,没什么额外开销,空间上也没有什么增加,但缺点就是不容易理解,编写复杂问题时困难。
因而,&能不用递归就不用递归,递归都可以用迭代来代替&这样的理解,还是辩证的来看待,不可一棍子打死。*/
1,2部分摘自网络,略有改动,向原作者致敬!
3.个人总结
程序调用自身的编程技巧称为递归
1)大问题化为小问题,可以极大的减少代码量;
2)用有限的语句来定义对象的无限集合.;
3)代码更简洁清晰,可读性更好
1)递归调用函数,浪费空间;
2)递归太深容易造成堆栈的溢出;
利用变量的原值推算出变量的一个新值,迭代就是A不停的调用B.
1)迭代效率高,运行时间只因循环次数增加而增加;
2)没什么额外开销,空间上也没有什么增加,
1)&不容易理解;
2)&代码不如递归简洁;
3)&编写复杂问题时困难。
1)&递归中一定有迭代,但是迭代中不一定有递归,大部分可以相互转换。
2)&能用迭代的不用递归,递归调用函数,浪费空间,并且递归太深容易造成堆栈的溢出./*相对*/
举例如下:
#include&&iostream&&&
using&namespace&&&
long&fab_iteration(int&index)&&
&&&&if(index&==&1&||&index&==&2)&&
&&&&&&&&return&1;&&
&&&&else&&
&&&&&&&&long&f1&=&1L;&&
&&&&&&&&long&f2&=&1L;&&
&&&&&&&&long&f3&=&0;&&
&&&&&&&&for(int&i&=&0;&i&&&index-2;&i++)&&
&&&&&&&&{&&&&&
&&&&&&&&&&&&f3&=&f1&+&f2;&
&&&&&&&&&&&&f1&=&f2;&&
&&&&&&&&&&&&f2&=&f3;&&
&&&&&&&&}&&
&&&&&&&&&return&f3;&&
&long&fab_recursion(int&index)&&
&&&&if(index&==&1&||&index&==&2)&&
&&&&&&&&return&1;&&
&&&&else&&
&&&&&&&&return&fab_recursion(index-1)+fab_recursion(index-2);&&&&
int&main(int&argc,&char*&argv[])&&
&&&&cout&&&&fab_recursion(10)&&&&&&
&&&&cout&&&&fab_iteration(10)&&&&&&
&&&&return&0;&&
阅读(...) 评论()&&文章详情
什么是迭代跟递归算法?二者有什么区别?
  迭代算法是用计算机解决问题的一种基本方法。它利用计算机运算速度快、适合做重复性操作的特点,让计算机对一组指令(或一定步骤)进行重复执行,在每次执行这组指令(或这些步骤)时,都从变量的原值推出它的一个新值。
  利用迭代算法解决问题,需要做好以下三个方面的工作:
  一、确定迭代变量。在可以用迭代算法解决的问题中,至少存在一个直接或间接地不断由旧值递推出新值的变量,这个变量就是迭代变量。
  二、建立迭代关系式。所谓迭代关系式,指如何从变量的前一个值推出其下一个值的公式(或关系)。迭代关系式的建立是解决迭代问题的要害,通常可以使用递推或倒推的方法来完成。
  三、对迭代过程进行控制。在什么时候结束迭代过程?这是编写迭代程序必须考虑的问题。不能让迭代过程无休止地重复执行下去。迭代过程的控制通常可分为两种情况:一种是所需的迭代次数是个确定的值,可以计算出来;另一种是所需的迭代次数无法确定。对于前一种情况,可以构建一个固定次数的循环来实现对迭代过程的控制;对于后一种情况,需要进一步分析出用来结束迭代过程的条件。
  例 1 : 一个饲养场引进一只刚出生的新品种兔子,这种兔子从出生的下一个月开始,每月新生一只兔子,新生的兔子也如此繁殖。假如所有的兔子都不死去,问到第 12 个月时,该饲养场共有兔子多少只?
  分析: 这是一个典型的递推问题。我们不妨假设第 1 个月时兔子的只数为 u 1 ,第 2 个月时兔子的只数为 u 2 ,第 3 个月时兔子的只数为 u 3 ,……根据题意,“这种兔子从出生的下一个月开始,每月新生一只兔子”,则有
以下是引用片段:u&1&=&1&,&u&2&=&u&1&+&u&1&×&1&=&2&,&u&3&=&u&2&+&u&2&×&1&=&4&,……
  根据这个规律,可以归纳出下面的递推公式:
以下是引用片段:  u&n&=&u&n&-&1&×&2&(n&≥&2)
  对应 u n 和 u n - 1 ,定义两个迭代变量 y 和 x ,可将上面的递推公式转换成如下迭代关系:
以下是引用片段:  y=x*2   x=y
  让计算机对这个迭代关系重复执行 11 次,就可以算出第 12 个月时的兔子数。参考程序如下:
以下是引用片段:  cls   x=1   for&i=2&to&12   y=x*2   x=y   next&i   print&y   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 ,则有
以下是引用片段:  x&14&=x&15&/2&、&x&13&=x&14&/2&、……&x&n-1&=x&n&/2&(n&≥&1)
  因为第 15 次分裂之后的个数 x 15 是已知的,假如定义迭代变量为 x ,则可以将上面的倒推公式转换成如下的迭代公式:
  x=x/2 ( x 的初值为第 15 次分裂之后的个数 2 20 )
  让这个迭代公式重复执行 15 次,就可以倒推出第 1 次分裂之前的阿米巴个数。因为所需的迭代次数是个确定的值,我们可以使用一个固定次数的循环来实现对迭代过程的控制。参考程序如下:
以下是引用片段:  cls   x=2^20   for&i=1&to&15   x=x/2   next&i   print&x   end
  例 3 : 验证谷角猜想。日本数学家谷角静夫在研究自然数时发现了一个希奇现象:对于任意一个自然数 n ,若 n 为偶数,则将其除以 2 ;若 n 为奇数,则将其乘以 3 ,然后再加 1 。如此经过有限次运算后,总可以得到自然数 1 。人们把谷角静夫的这一发现叫做“谷角猜想”。
  要求:编写一个程序,由键盘输入一个自然数 n ,把 n 经过有限次运算后,最终变成自然数 1 的全过程打印出来。
  分析: 定义迭代变量为 n ,按照谷角猜想的内容,可以得到两种情况下的迭代关系式:当 n 为偶数时, n=n/2 ;当 n 为奇数时, n=n*3+1 。用 QBASIC 语言把它描述出来就是:
以下是引用片段:  if&n&为偶数&then   n=n/2   else   n=n*3+1   end&if
  这就是需要计算机重复执行的迭代过程。这个迭代过程需要重复执行多少次,才能使迭代变量 n 最终变成自然数 1 ,这是我们无法计算出来的。因此,还需进一步确定用来结束迭代过程的条件。仔细分析题目要求,不难看出,对任意给定的一个自然数 n ,只要经过有限次运算后,能够得到自然数 1 ,就已经完成了验证工作。因此,用来结束迭代过程的条件可以定义为: n=1 。参考程序如下:
以下是引用片段:  cls   input&"Please&input&n=";n   do&until&n=1   if&n&mod&2=0&then   rem&假如&n&为偶数,则调用迭代公式&n=n/2   n=n/2   print&"—";n;   else   n=n*3+1   print&"—";n;   end&if   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\n”,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(“\n”);   }
  具体使用迭代法求根时应注重以下两种可能发生的情况:
  (1) 假如方程无解,算法求出的近似根序列就不会收敛,迭代过程会变成死循环,因此在使用迭代算法前应先考察方程是否有解,并在程序中对迭代的次数给予限制;
  (2) 方程虽然有解,但迭代公式选择不当,或迭代的初始近似根选择不合理,也会导致迭代失败。
  递归是设计和描述算法的一种有力的工具,由于它在复杂算法的描述中被经常采用,为此在进一步介绍其他算法设计方法之前先讨论它。
  能采用递归描述的算法通常有这样的特征:为求解规模为N的问题,设法将它分解成规模较小的问题,然后从这些小问题的解方便地构造出大问题的解,并且这些规模较小的问题也能采用同样的分解和综合方法,分解成规模更小的问题,并从这些更小问题的解构造出规模较大问题的解。非凡地,当规模N=1时,能直接得解。
  【问题】 编写计算斐波那契(Fibonacci)数列的第n项函数fib(n)。
  斐波那契数列为:0、1、1、2、3、……,即:
以下是引用片段:  fib(0)=0;   fib(1)=1;   fib(n)=fib(n-1)+fib(n-2)&(当n&1时)。
  写成递归函数有:
以下是引用片段:  int&fib(int&n)   {&if&(n==0)&return&0;   if&(n==1)&return&1;   if&(n&1)&return&fib(n-1)+fib(n-2);   }
  递归算法的执行过程分递推和回归两个阶段。在递推阶段,把较复杂的问题(规模为n)的求解推到比原问题简单一些的问题(规模小于n)的求解。例如上例中,求解fib(n),把它推到求解fib(n-1)和fib(n-2)。也就是说,为计算fib(n),必须先计算fib(n-1)和fib(n- 2),而计算fib(n-1)和fib(n-2),又必须先计算fib(n-3)和fib(n-4)。依次类推,直至计算fib(1)和fib(0),分别能立即得到结果1和0。在递推阶段,必须要有终止递归的情况。例如在函数fib中,当n为1和0的情况。
  在回归阶段,当获得最简单情况的解后,逐级返回,依次得到稍复杂问题的解,例如得到fib(1)和fib(0)后,返回得到fib(2)的结果,……,在得到了fib(n-1)和fib(n-2)的结果后,返回得到fib(n)的结果。
  在编写递归函数时要注重,函数中的局部变量和参数知识局限于当前调用层,当递推进入“简单问题”层时,原来层次上的参数和局部变量便被隐蔽起来。在一系列“简单问题”层,它们各有自己的参数和局部变量。
  由于递归引起一系列的函数调用,并且可能会有一系列的重复计算,递归算法的执行效率相对较低。当某个递归算法能较方便地转换成递推算法时,通常按递推算法编写程序。例如上例计算斐波那契数列的第n项的函数fib(n)应采用递推算法,即从斐波那契数列的前两项出发,逐次由前两项计算出下一项,直至计算出要求的第n项。
  【问题】 组合问题
  问题描述:找出从自然数1、2、……、n中任取r个数的所有组合。例如n=5,r=3的所有组合为: (1)5、4、3 (2)5、4、2 (3)5、4、1
  (4)5、3、2 (5)5、3、1 (6)5、2、1
  (7)4、3、2 (8)4、3、1 (9)4、2、1
  (10)3、2、1
  分析所列的10个组合,可以采用这样的递归思想来考虑求组合函数的算法。设函数为void comb(int m,int k)为找出从自然数1、2、……、m中任取k个数的所有组合。当组合的第一个数字选定时,其后的数字是从余下的m-1个数中取k-1数的组合。这就将求m 个数中取k个数的组合问题转化成求m-1个数中取k-1个数的组合问题。设函数引入工作数组a[ ]存放求出的组合的数字,约定函数将确定的k个数字组合的第一个数字放在a[k]中,当一个组合求出后,才将a[ ]中的一个组合输出。第一个数可以是m、m-1、……、k,函数将确定组合的第一个数字放入数组后,有两种可能的选择,因还未去顶组合的其余元素,继续递归去确定;或因已确定了组合的全部元素,输出这个组合。细节见以下程序中的函数comb。
  【程序】
以下是引用片段:  #&include   #&define&MAXN&100   int&a[MAXN];   void&comb(int&m,int&k)   {&int&i,j;   for&(i=m;i&=k;i--)   {&a[k]=i;   if&(k&1)   comb(i-1,k-1);   else   {&for&(j=a[0];j&0;j--)   printf(“%4d”,a[j]);   printf(“\n”);   }   }   }   void&main()   {&a[0]=3;   comb(5,3);   }
  【问题】 背包问题
  问题描述:有不同价值、不同重量的物品n件,求从这n件物品中选取一部分物品的选择方案,使选中物品的总重量不超过指定的限制重量,但选中物品的价值之和最大。
  设n 件物品的重量分别为w0、w1、…、wn-1,物品的价值分别为v0、v1、…、vn-1。采用递归寻找物品的选择方案。设前面已有了多种选择的方案,并保留了其中总价值最大的方案于数组option[ ],该方案的总价值存于变量maxv。当前正在考察新方案,其物品选择情况保存于数组cop[ ]。假定当前方案已考虑了前i-1件物品,现在要考虑第i件物品;当前方案已包含的物品的重量之和为至此,若其余物品都选择是可能的话,本方案能达到的总价值的期望值为tv。算法引入tv是当一旦当前方案的总价值的期望值也小于前面方案的总价值maxv时,继续考察当前方案变成无意义的工作,应终止当前方案,立即去考察下一个方案。因为当方案的总价值不比maxv大时,该方案不会被再考察,这同时保证函数后找到的方案一定会比前面的方案更好。
  对于第i件物品的选择考虑有两种可能:
  (1) 考虑物品i被选择,这种可能性仅当包含它不会超过方案总重量限制时才是可行的。选中后,继续递归去考虑其余物品的选择。
  (2) 考虑物品i不被选择,这种可能性仅当不包含物品i也有可能会找到价值更大的方案的情况。
  按以上思想写出递归算法如下:
以下是引用片段:  try(物品i,当前选择已达到的重量和,本方案可能达到的总价值tv)   {&/*考虑物品i包含在当前方案中的可能性*/   if(包含物品i是可以接受的)   {&将物品i包含在当前方案中;   if&(i   try(i+1,tw+物品i的重量,tv);   else   /*又一个完整方案,因为它比前面的方案好,以它作为最佳方案*/   以当前方案作为临时最佳方案保存;   恢复物品i不包含状态;   }   /*考虑物品i不包含在当前方案中的可能性*/   if&(不包含物品i仅是可男考虑的)   if&(i   try(i+1,tw,tv-物品i的价值);   else   /*又一个完整方案,因它比前面的方案好,以它作为最佳方案*/   以当前方案作为临时最佳方案保存;   }
  为了理解上述算法,特举以下实例。设有4件物品,它们的重量和价值见表:
  物品 0 1 2 3
  重量 5 3 2 1
  价值 4 4 3 1
  并设限制重量为7。则按以上算法,下图表示找解过程。由图知,一旦找到一个解,算法就进一步找更好的佳。如能判定某个查找分支不会找到更好的解,算法不会在该分支继续查找,而是立即终止该分支,并去考察下一个分支。
  按上述算法编写函数和程序如下:
  【程序】
以下是引用片段:  #&include   #&define&N&100   double&limitW,totV,maxV;   int&option[N],cop[N];   strUCt&{&double&   double&   }a[N];   int&n;   void&find(int&i,double&tw,double&tv)   {&int&k;   /*考虑物品i包含在当前方案中的可能性*/   if&(tw+a.weight&=limitW)   {&cop=1;   if&(i   else   {&for&(k=0;k   option[k]=cop[k];   maxv=   }   cop=0;   }   /*考虑物品i不包含在当前方案中的可能性*/   if&(tv-a.value&maxV)   if&(i   else   {&for&(k=0;k   option[k]=cop[k];   maxv=tv-a.   }   }   void&main()   {&int&k;   double&w,v;   printf(“输入物品种数\n”);   scanf((“%d”,&n);   printf(“输入各物品的重量和价值\n”);   for&(totv=0.0,k=0;k   {&scanf(“%1f%1f”,&w,&v);   a[k].weight=w;   a[k].value=v;   totV+=V;   }   printf(“输入限制重量\n”);   scanf(“%1f”,&limitV);   maxv=0.0;   for&(k=0;k&find(0,0.0,totV);   for&(k=0;k   if&(option[k])&printf(“%4d”,k+1);   printf(“\n总价值为%.2f\n”,maxv);   }
  作为对比,下面以同样的解题思想,考虑非递归的程序解。为了提高找解速度,程序不是简单地逐一生成所有候选解,而是从每个物品对候选解的影响来形成值得进一步考虑的候选解,一个候选解是通过依次考察每个物品形成的。对物品i的考察有这样几种情况:当该物品被包含在候选解中依旧满足解的总重量的限制,该物品被包含在候选解中是应该继续考虑的;反之,该物品不应该包括在当前正在形成的候选解中。同样地,仅当物品不被包括在候选解中,还是有可能找到比目前临时最佳解更好的候选解时,才去考虑该物品不被包括在候选解中;反之,该物品不包括在当前候选解中的方案也不应继续考虑。对于任一值得继续考虑的方案,程序就去进一步考虑下一个物品。
  【程序】
以下是引用片段:  #&include   #&define&N&100   double&limitW;   int&cop[N];   struct&ele&{&double&   double&   }&a[N];   int&k,n;   struct&{&int&;   double&   double&   }twv[N];   void&next(int&i,double&tw,double&tv)   {&twv.=1;   twv.tw=   twv.tv=   }   double&find(struct&ele&*a,int&n)   {&int&i,k,f;   double&maxv,tw,tv,   maxv=0;   for&(totv=0.0,k=0;k   totv+=a[k].   next(0,0.0,totv);   i=0;   While&(i&=0)   {&f=twv.;   tw=twv.   tv=twv.   switch(f)   {&case&1:&twv.++;   if&(tw+a.weight&=limitW)   if&(i   {&next(i+1,tw+a.weight,tv);   i++;   }   else   {&maxv=   for&(k=0;k   cop[k]=twv[k].!=0;   }      case&0:&i--;      default:&twv.=0;   if&(tv-a.value&maxv)   if&(i   {&next(i+1,tw,tv-a.value);   i++;   }   else   {&maxv=tv-a.   for&(k=0;k   cop[k]=twv[k].!=0;   }      }   }   return&   }   void&main()   {&double&   printf(“输入物品种数\n”);   scanf((“%d”,&n);   printf(“输入限制重量\n”);   scanf(“%1f”,&limitW);   printf(“输入各物品的重量和价值\n”);   for&(k=0;k   scanf(“%1f%1f”,&a[k].weight,&a[k].value);   maxv=find(a,n);   printf(“\n选中的物品为\n”);   for&(k=0;k   if&(option[k])&printf(“%4d”,k+1);   printf(“\n总价值为%.2f\n”,maxv);   }   递归的基本概念和特点
  程序调用自身的编程技巧称为递归( recursion)。
  一个过程或函数在其定义或说明中又直接或间接调用自身的一种方法,它通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解,递归策略只需少量的程序就可描述出解题过程所需要的多次重复计算,大大地减少了程序的代码量。递归的能力在于用有限的语句来定义对象的无限集合。用递归思想写出的程序往往十分简洁易懂。
  一般来说,递归需要有边界条件、递归前进段和递归返回段。当边界条件不满足时,递归前进;当边界条件满足时,递归返回。
  注重:
  (1) 递归就是在过程或函数里调用自身;
  2) 在使用递增归策略时,必须有一个明确的递归结束条件,称为递归出口。
(C) Knowsky.com518被浏览136,488分享邀请回答牛顿迭代法_360百科baike.so.com突然觉得,迭代和递归除了“重复计算多次”这点共性,其他就没啥一样啊。【迭代】从粗糙到精确:比如牛顿迭代,想要用一个函数来表示这条曲线中纵坐标y和横坐标x的数学关系(例如可能是y=x还是y=x*x?),可以首先给一个初始函数y=f0(x),然后根据算法g,计算第一次,f1=g(f0),得到f1。这里不要纠结g的细节,只表示有这个过程。y=f1(x)更接近实际曲线,但精度还不够,于是用g计算第二次,f2=g(f1),得到f2。y=f2(x)比y=f0(x)、y=f1(x)更能精确地表示y和x的关系,但依然不够……于是用g计算第三次……在觉得精度满足的时候可以停下来。例如,如果你觉得y=f2(x)已经能够很好的表示y和x的关系,这个误差你可以接受,然后你就不用算f3了。如果在这里停下,我们一共迭代了2次,第一次迭代的效果是从f1得到f2,第二次迭代的效果是从f2得到f3……为什么要执行迭代?因为f2比f1精确,f3比f2精确……继续迭代,会越来越精确……只要你愿意,可以迭代无数次【递归】大事化小,小事化了:例如,递归是在函数f()的实现,在满足条件时会调用f()。满足条件时会调用f(),很重要。也就是在不满足这个条件时,不调用f(),不再进行下一轮的递归了。否则,f()无条件调用内层f(),内层f()又无条件调用内内层f(),内内层f()又无条件调用内内内层f()……没完没了。例如:递归实现二分查找:每递归一次,查找范围可以缩小一半;当最后只剩下一个,递归就该结束了。1添加评论分享收藏感谢收起

我要回帖

更多关于 迭代与递归的区别 的文章

 

随机推荐