您的位置:首页 > 其它

递归,递推,迭代区别:

2017-04-16 16:13 218 查看
递归与递推区别详解一

贪心、递归、递推以及动态规划算法的分析与对比

迭代与递归

程序调用自身的编程技巧称为递归( recursion)。递归做为一种算法在程序设计语言中广泛应用。 一个过程或函数在其定义或说明中有直接或间接调用自身的一种方法,它通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解,递归策略只需少量的程序就可描述出解题过程所需要的多次重复计算,大大地减少了程序的代码量。递归的能力在于用有限的语句来定义对象的无限集合。一般来说,递归需要有边界条件、递归前进段和递归返回段。当边界条件不满足时,递归前进;当边界条件满足时,递归返回。——摘自百度百科

递推算法是一种用若干步可重复的简运算(规律)来描述复杂问题的方法。递推是序列计算机中的一种常用算法。它是按照一定的规律来计算序列中的每个项,通常是通过计算机前面的一些项来得出序列中的指定象的值。

迭代重复反馈过程的活动,俗称循环,其目的通常是为了逼近所需目标或结果。每一次对过程的重复称为一次“迭代”,而每一次迭代得到的结果会作为下一次迭代的初始值

迭代举例:用迭代法求平方根

代码如下:

#include<stdio.h>
#include<math.h>
int main(){
float a,x0,x1;
int i=0;
printf("enter a positive number:");
scanf("%f",&a);
x0=a/2;   //给x赋初值(也可以是另外的值)
x1=(x0+a/x0)/2;
do
{   i++;
x0=x1;
x1=(x0+a/x0)/2;
}while(fabs(x0-x1)>=1e-5);
printf("%f的平方根为:%f\n",a,x1);
printf("%d",i);
return 0;
}


简单来说,关于递推和递归,概念如下:

void digui()
{
if(你不懂)    digui();
if(你懂了)    return  hehe;
}


void ditui()
{
if(你没懂)  ditui();
if(你懂了)  cout<<"hehe";
}


举例:

1.

小猴子第一天摘下若干桃子,当即吃掉一半,又多吃一个.第二天早上又将剩下的桃子吃一半,又多吃一个.以后每天早上吃前一天剩下的一半另一个.到第10天早上猴子想再吃时发现,只剩下一个桃子了.问第一天猴子共摘多少个桃子?

2.

有雌雄一对兔子,假定过两个月便可繁殖雌雄各一的一对小兔子。问过n个月后共有多少对兔子?

这是著名的斐波那契数列= =递推必刷题之一,当然还有很多关于这道题的难题,暂时不一一列举

3.角谷定理。输入一个自然数,若为偶数,则把它除以2,若为奇数,则把它乘以3加1。经过如此有限次运算后,总可以得到自然数值1。求经过多少次可得到自然数1。 如:输入22, 输出

22 11 34 17 52 26 13 40 20 10 5 16 8 4 2 1

STEP=16


**

第二部分 递推与迭代

递推法与迭代法

  递推:Un=Un-1*2

  迭代:y=x*2;x=y;

  如果就这两个式子来编程的话,递推会用到递归函数或生成一个长为n数组,但如果是迭代,就只会用到一个while或for循环,而且只用2个变量,程序的效率比递推法要高。应该是因为迭代法是在递推法的基础上再进一步的分析,以得到便于编程解决的式子。

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

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

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

  

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

  

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

小结:

递归与循环:

从理论上说,所有的递归函数都可以转换为迭代函数,反之亦然,然而代价通常都是比较高的。当递归次数较多时,内存占用也会随之增加。

递推与递归:

从程序上看,递归表现为自己调用自己,递推则没有这样的形式。

递归是从问题的最终目标出发,逐渐将复杂问题化为简单问题,最终求得问题

是逆向的。递推是从简单问题出发,一步步的向前发展,最终求得问题。是正向的。

递归中,问题的n要求是计算之前就知道的,而递推可以在计算中确定,不要求计算前就知道n。

一般来说,递推的效率高于递归(当然是递推可以计算的情况下)

用递归考虑问题,非递归方式编写

迭代:利用变量的原值推算出变量的一个新值.如果递归是自己调用自己的话,迭代就是A不停的调用B.

递归中一定有迭代,但是迭代中不一定有递归,大部分可以相互转换.能用迭代的不用递归,递归调用函数,浪费空间,并且递归太深容易造成堆栈的溢出

详见 迭代与递归
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: