精华内容
下载资源
问答
  • 迭代 递归 普通循环的区别

    千次阅读 2017-01-13 11:06:31
    迭代是函数内某段代码实现循环,而迭代与普通循环的区别是:循环代码中参与运算的变量同时是保存结果的变量,当前保存的结果作为下一次循环计算的初始值。递归循环中,遇到满足终止条件的情况时逐层返回来结束。迭代...

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

    递归循环中,遇到满足终止条件的情况时逐层返回来结束。迭代则使用计数器结束循环。当然很多情况都是多种循环混合采用,这要根据具体需求。

    递归的例子,比如给定一个整数数组,采用折半查询返回指定值在数组中的索引,假设数组已排序,为方便描述,假设元素都为正数,数组长度为2的整数倍。
    折半查询是查询的一种,比遍历所有元素要快很多。

    int Find(int *ary,int index,int len,int value)
    {
    if(len==1)//最后一个元素
    {
    if (ary[index]==value)return index;//成功查询返回索引
    return -1;//失败,返回-1
    }
    //如果长度大于1,进行折半递归查询
    int half=len/2;
    //检查被查值是否大于上半部分最后一个值,如果是则递归查询后半部分
    if(value>ary[index+half-1])
    return Find(ary,index+half,half,value);
    //否则递归查询上半部分
    return Find(ary,index,half,value);
    }

    迭代经典例子就是实数的累加,比如计算1-100所有实数的和。

    int v=1;
    for(i=2;i<=100;i++)
    {
    v=v+i;
    }

    展开全文
  • 迭代与递归的区别

    万次阅读 多人点赞 2018-09-04 15:52:12
    迭代和递归的区别: 从“编程之美”的角度看,可以借用一句非常经典的话:“迭代是人,递归是神!”来从宏观上对二者进行把握。 递归:重复调用函数自身实现循环称为递归;  递归实际上不断地深层调用函数,直到...

    迭代和递归的区别:

    从“编程之美”的角度看,可以借用一句非常经典的话:“迭代是人,递归是神!”来从宏观上对二者进行把握。

    • 递归:重复调用函数自身实现循环称为递归;

           递归实际上不断地深层调用函数,直到函数有返回才会逐层的返回,递归是用栈机制实现的,每深入一层,都要占去一块栈数据区域,因此,递归涉及到运行时的堆栈开销(参数必须压入堆栈保存,直到该层函数调用返回为止),所以有可能导致堆栈溢出的错误;但是递归编程所体现的思想正是人们追求简洁、将问题交给计算机,以及将大问题分解为相同小问题从而解决大问题的动机。

             例如:if else 调用自己,并在合适时机退出

     

    • 迭代:利用变量的原值推出新值称为迭代,或着说迭代是函数内某段代码实现循环;

            迭代大部分时候需要人为的对问题进行剖析,分析问题的规律所在,将问题转变为一次次的迭代来逼近答案。迭代不像递归那样对堆栈有一定的要求,另外一旦问题剖析完毕,就可以很容易的通过循环加以实现。迭代的效率高,但却不太容易理解,当遇到数据结构的设计时,比如图表、二叉树、网格等问题时,使用就比较困难,而是用递归就能省掉人工思考解法的过程,只需要不断的将问题分解直到返回就可以了。

             例如:for,while循环

    • 两者关系:所有的迭代可以转换为递归,但递归不一定可以转换成迭代。

     总结如下:

      定义 优点 缺点
    递归 重复调用函数自身实现循环

    a.用有限的循环语句实现无限集合;

    b.代码易读;

    c.大问题转化成小问题,减少了代码量。

    a.递归不断调用函数,浪费空间

    b.容易造成堆栈溢出

    迭代

    利用变量的原值推出新值;

    函数内某段代码实现循环。

    a.效率高,运行时间只随循环的增加而增加;

    b.无额外开销。

    a.代码难理解;

    b.代码不如递归代码简洁;

    c.编写复杂问题时,代码逻辑不易想出

    两者关系

    a.递归中一定有迭代,但是迭代中不一定有递归;大部分可以相互转换。

    b.相对来说,能用迭代不用递归(因为递归不断调用函数,浪费空间,容易造成堆栈溢出)

    展开全文
  • 循环迭代递归的区别

    千次阅读 2017-08-24 14:13:37
    迭代是函数内某段代码实现循环,而迭代与普通循环的区别是:循环代码中参与运算的变量同时是保存结果的变量,当前保存的结果作为下一次循环计算的初始值。   递归循环中,遇到满足终止条件的情况时逐层返回来...
    递归和迭代都是循环的一种。
    简单地说,递归是重复调用函数自身实现循环。迭代是函数内某段代码实现循环,而迭代与普通循环的区别是:循环代码中参与运算的变量同时是保存结果的变量,当前保存的结果作为下一次循环计算的初始值。
     
    递归循环中,遇到满足终止条件的情况时逐层返回来结束。迭代则使用计数器结束循环。当然很多情况都是多种循环混合采用,这要根据具体需求。
     
    递归的例子,比如给定一个整数数组,采用折半查询返回指定值在数组中的索引,假设数组已排序,为方便描述,假设元素都为正数,数组长度为2的整数倍。
    折半查询是查询的一种,比遍历所有元素要快很多。
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    int Find(int *ary,int index,int len,int value)
    {
        if(len==1)//最后一个元素
        {
            if (ary[index]==value)return index;//成功查询返回索引
            return -1;//失败,返回-1
        }
        //如果长度大于1,进行折半递归查询
        int half=len/2;
        //检查被查值是否大于上半部分最后一个值,如果是则递归查询后半部分
        if(value>ary[index+half-1])
            return Find(ary,index+half,half,value);
        //否则递归查询上半部分
        return Find(ary,index,half,value);
    }
     
    迭代经典例子就是实数的累加,比如计算1-100所有实数的和。

    1.所谓的递归慢到底是什么原因呢?
    大家都知道递归的实现是通过调用函数本身,函数调用的时候,每次调用时要做地址保存,参数传递等,这是通过一个递归工作栈实现的。具体是每次调用函数本身要保存的内容包括:局部变量、形参、调用函数地址、返回值。那么,如果递归调用N次,就要分配N*局部变量、N*形参、N*调用函数地址、N*返回值。这势必是影响效率的。
    2.用循环效率会比递归效率高吗?
    递归与循环是两种不同的解决问题的典型思路。当然也并不是说循环效率就一定比递归高,递归和循环是两码事,递归带有栈操作,循环则不一定,两个概念不是一个层次,不同场景做不同的尝试。
    2.1递归算法:
    优点:代码简洁、清晰,并且容易验证正确性。(如果你真的理解了算法的话,否则你更晕)
    缺点:它的运行需要较多次数的函数调用,如果调用层数比较深,需要增加额外的堆栈处理(还有可能出现堆栈溢出的情况),比如参数传递需要压栈等操作,会对执行效率有一定影响。但是,对于某些问题,如果不使用递归,那将是极端难看的代码。
    2.2循环算法:
    优点:速度快,结构简单。
    缺点:并不能解决所有的问题。有的问题适合使用递归而不是循环。如果使用循环并不困难的话,最好使用循环。
    2.3递归算法和循环算法总结:
    1. 一般递归调用可以处理的算法,也通过循环去解决常需要额外的低效处理。
    2. 现在的编译器在优化后,对于多次调用的函数处理会有非常好的效率优化,效率未必低于循环。
    3.递归和循环两者完全可以互换。如果用到递归的地方可以很方便使用循环替换,而不影响程序的阅读,那么替换成递归往往是好的。(例如:求阶乘的递归实现与循环实现。)
    3.那么递归使用的栈是什么样的一个栈呢?
    首先,看一下系统栈和用户栈的用途。
    3.1系统栈(也叫核心栈、内核栈)是内存中属于操作系统空间的一块区域,其主要用途为: (1)保存中断现场,对于嵌套中断,被中断程序的现场信息依次压入系统栈,中断返回时逆序弹出; (2)保存操作系统子程序间相互调用的参数、返回值、返回点以及子程序(函数)的局部变量。
    3.2用户栈是用户进程空间中的一块区域,用于保存用户进程的子程序间相互调用的参数、返回值、返回点以及子程序(函数)的局部变量。我们编写的递归程序属于用户程序,因此使用的是用户栈。
    展开全文
  • 迭代器Iteratorfor循环的区别

    万次阅读 多人点赞 2017-09-11 15:34:42
    迭代器是一种模式,它可以使得对于序列类型数据结构遍历行为被遍历对象分离,即我们无需关心该序列底层结构是什么样子。只要拿到这个对象,使用迭代器就可以遍历这个对象内部. 1.Iterator Java...

    迭代器是一种模式,它可以使得对于序列类型的数据结构的遍历行为与被遍历的对象分离,即我们无需关心该序列的底层结构是什么样子的。只要拿到这个对象,使用迭代器就可以遍历这个对象的内部.

    1.Iterator

    Java提供一个专门的迭代器<<interface>>Iterator,我们可以对某个序列实现该interface,来提供标准的Java迭代器。Iterator接口实现后的功能是“使用”一个迭代器.

    文档定义:

    1. Package java.util;

    2. publicinterface Iterator<E> {

    3. boolean hasNext();//判断是否存在下一个对象元素

    4. E next();

    5. void remove();
    6. }
    [java] view plain copy
     print?
    1. <span style="font-size:18px;">Package  java.util;   
    2.   
    3. public interface Iterator<E> {  
    4.   
    5.     boolean hasNext();//判断是否存在下一个对象元素  
    6.   
    7.      E next();  
    8.   
    9.     void remove();  
    10. }  
    11. </span>  


    2.Iterable

    Java中还提供了一个Iterable接口,Iterable接口实现后的功能是“返回”一个迭代器,我们常用的实现了该接口的子接口有: Collection<E>, Deque<E>, List<E>, Queue<E>, Set<E> 等.该接口的iterator()方法返回一个标准的Iterator实现。实现这个接口允许对象成为 Foreach 语句的目标。就可以通过Foreach语法遍历你的底层序列。

    Iterable接口包含一个能够产生Iterator的iterator()方法,并且Iterable接口被foreach用来在序列中移动。因此如果创建了任何实现Iterable接口的类,都可以将它用于foreach语句中。

    1. 文档定义:

    2. Package java.lang;

    3. import java.util.Iterator;
    4. public interface Iterable<T> {
    5. Iterator<T> iterator();
    6. }
    [java] view plain copy
     print?
    1. <span style="font-size:18px;">文档定义:  
    2.   
    3. Package  java.lang;   
    4.   
    5. import  java.util.Iterator;   
    6. public interface Iterable<T> {   
    7.      Iterator<T> iterator();   
    8. }  
    9.   
    10. </span>  


    1. 使用Iterator的简单例子

    2. import java.util.*;

    3. publicclass TestIterator {


    4. public static void main(String[] args) {



    5. List list=new ArrayList();

    6. Map map=new HashMap();

    7. for(int i=0;i<10;i++){

    8. list.add(new String("list"+i) );

    9. map.put(i, new String("map"+i));

    10. }

    11. Iterator iterList= list.iterator();//List接口实现了Iterable接口

    12. while(iterList.hasNext()){

    13. String strList=(String)iterList.next();

    14. System.out.println(strList.toString());

    15. }

    16. Iterator iterMap=map.entrySet().iterator();

    17. while(iterMap.hasNext()){

    18. Map.Entry strMap=(Map.Entry)iterMap.next();

    19. System.out.println(strMap.getValue());



    20. }

    21. }

    22. }

    23. <span style="color: rgb(0, 0, 153); font-size: 18px;"> </span><span style="color: rgb(0, 0, 153); font-size: 18px;"></span>
    [java] view plain copy
     print?
    1. <span style="font-size:18px;">使用Iterator的简单例子  
    2.   
    3. import java.util.*;  
    4.   
    5. public class TestIterator {  
    6.   
    7.   
    8.    public static void main(String[] args) {  
    9.   
    10.           
    11.   
    12.       List list=new ArrayList();  
    13.   
    14.       Map map=new HashMap();  
    15.   
    16.       for(int i=0;i<10;i++){  
    17.   
    18.           list.add(new String("list"+i) );  
    19.   
    20.           map.put(i, new String("map"+i));  
    21.   
    22.       }  
    23.   
    24.       Iterator iterList= list.iterator();//List接口实现了Iterable接口  
    25.   
    26.         while(iterList.hasNext()){  
    27.   
    28.           String strList=(String)iterList.next();  
    29.   
    30.           System.out.println(strList.toString());  
    31.   
    32.       }  
    33.   
    34.       Iterator iterMap=map.entrySet().iterator();  
    35.   
    36.       while(iterMap.hasNext()){  
    37.   
    38.           Map.Entry  strMap=(Map.Entry)iterMap.next();  
    39.   
    40.           System.out.println(strMap.getValue());  
    41.   
    42.    
    43.   
    44.       }  
    45.   
    46.    }  
    47.   
    48. }  
    49.   
    50.  <span style="color:#0099;">  </span><span style="color:#0099;"></span> </span>  

    接口Iterator在不同的子接口中会根据情况进行功能的扩展,例如针对List的迭代器ListIterator,该迭代器只能用于各种List类的访问。ListIterator可以双向移动。添加了previous()等方法.

    3 Iterator与泛型搭配

    Iterator对集合类中的任何一个实现类,都可以返回这样一个Iterator对象。可以适用于任何一个类。

    因为集合类(List和Set等)可以装入的对象的类型是不确定的,从集合中取出时都是Object类型,用时都需要进行强制转化,这样会很麻烦,用上泛型,就是提前告诉集合确定要装入集合的类型,这样就可以直接使用而不用显示类型转换.非常方便.

    4.foreach和Iterator的关系

    for each是jdk5.0新增加的一个循环结构,可以用来处理集合中的每个元素而不用考虑集合定下标。

    格式如下 

    for(variable:collection){ statement; }

    定义一个变量用于暂存集合中的每一个元素,并执行相应的语句(块)。collection必须是一个数组或者是一个实现了lterable接口的类对象。 

    1. 上面的例子使用泛型和forEach的写法:

    2. import java.util.*;
    3. public class TestIterator {



    4. public static void main(String[] args) {



    5. List<String> list=new ArrayList<String> ();

    6. for(int i=0;i<10;i++){

    7. list.add(new String("list"+i) );

    8. }

    9. for(String str:list){

    10. System.out.println(str);

    11. }

    12. }
    [java] view plain copy
     print?
    1. <span style="font-size:18px;">上面的例子使用泛型和forEach的写法:  
    2.   
    3. import java.util.*;  
    4. public class TestIterator {  
    5.   
    6.   
    7.   
    8.    public static void main(String[] args) {  
    9.   
    10.           
    11.   
    12.       List<String>  list=new ArrayList<String> ();  
    13.   
    14.       for(int i=0;i<10;i++){  
    15.   
    16.           list.add(new String("list"+i) );  
    17.   
    18.       }  
    19.   
    20.       for(String str:list){  
    21.   
    22.         System.out.println(str);  
    23.   
    24.       }    
    25.   
    26. }  
    27.   
    28. </span>  


    可以看出,使用for each循环语句的优势在于更加简洁,更不容易出错,不必关心下标的起始值和终止值。

    forEach不是关键字,关键字还是for,语句是由iterator实现的,他们最大的不同之处就在于remove()方法上。

    一般调用删除和添加方法都是具体集合的方法,例如:

    List list = new ArrayList(); list.add(...); list.remove(...);

    但是,如果在循环的过程中调用集合的remove()方法,就会导致循环出错,因为循环过程中list.size()的大小变化了,就导致了错误。 所以,如果想在循环语句中删除集合中的某个元素,就要用迭代器iterator的remove()方法,因为它的remove()方法不仅会删除元素,还会维护一个标志,用来记录目前是不是可删除状态,例如,你不能连续两次调用它的remove()方法,调用之前至少有一次next()方法的调用。

    forEach就是为了让用iterator循环访问的形式简单,写起来更方便。当然功能不太全,所以但如有删除操作,还是要用它原来的形式。

    4 使用for循环与使用迭代器iterator的对比

    效率上的各有有事

    采用ArrayList对随机访问比较快,而for循环中的get()方法,采用的即是随机访问的方法,因此在ArrayList里,for循环较快

    采用LinkedList则是顺序访问比较快,iterator中的next()方法,采用的即是顺序访问的方法,因此在LinkedList里,使用iterator较快

    从数据结构角度分析,for循环适合访问顺序结构,可以根据下标快速获取指定元素.而Iterator 适合访问链式结构,因为迭代器是通过next()和Pre()来定位的.可以访问没有顺序的集合.

    而使用 Iterator 的好处在于可以使用相同方式去遍历集合中元素,而不用考虑集合类的内部实现(只要它实现了 java.lang.Iterable 接口),如果使用 Iterator 来遍历集合中元素,一旦不再使用 List 转而使用 Set 来组织数据,那遍历元素的代码不用做任何修改,如果使用 for 来遍历,那所有遍历此集合的算法都得做相应调整,因为List有序,Set无序,结构不同,他们的访问算法也不一样.

    展开全文
  • 乍一看,这几个词好像都重复(repeat)有关,但有又好像不完全是重复意思。那么这几个词到底各是什么含义,有什么区别和联系呢?下面就试着解释一下。 循环(loop),指是在满足条件情况下,重复执行同一...
  • (1)仅对其遍历而不修改容器大小时,只使用foreach循环(2)需要边遍历边修改容器大小时(插入删除元素),只使用迭代循环 import java.util.HashMap;import java.util.Iterator;import java.util.List;import ...
  • 1 迭代器返回可枚举对象。传统遍历返回不是。 2 迭代器作为遍历,语法使用更为简单。不用考虑下标。 3 迭代器相对于传统遍历来说性能更好。这应该也是为何发展迭代最主要原因。因为迭代器返回的迭代器对象...
  • 其中,迭代与普通循环的区别是:迭代时,循环代码中参与运算的变量同时是保存结果的变量,当前保存的结果作为下一次循环计算的初始值。 2、算法结束方式不同 递归循环中,遇到满足终止条件的情况时逐层...
  • 1、循环(loop),指是在满足条件情况下,重复执行同一段代码。比如,while语句。2、迭代(iterate),指是按照某种顺序逐个访问列表中每一项。比如,for语句。3、遍历(traversal),指是按照一定规则...
  • 递归与迭代的区别

    2017-09-14 07:59:26
    迭代与普通循环的区别是:迭代循环中,参与运算的变量同时是保存结果的变量,当前保存的结果做为下一次循环的初始值(如:v=v+1)。 递归与迭代都是基于控制结构:迭代用重复结构,而递归用选择结构。 递归与迭代...
  • 迭代与递归区别

    2015-03-12 13:20:00
    迭代是函数内某段代码实现循环,而迭代与普通循环的区别是:循环代码中参与运算的变量同时是保存结果的变量,当前保存的结果作为下一次循环计算的初始值。从以下两组代码中可以看出迭代与递归的区别: 递归方法: ...
  • 1.1,递归与循环的区别 2,递归函数实例 2.1,Fibonacci sequence(斐波那契数列) 2.2,Collatz sequence 1,什么是递归 递归最初给我的感觉就是循环嵌套调用(并不准确),对于递归这种思想,可以从递归...
  • 可以看出,使用for each循环语句的优势在于更加简洁,更不容易出错,不必关心下标的起始值和终止值。 forEach不是关键字,...但是,如果在循环的过程中调用集合的remove()方法,就会导致循环出错,因为循环过程中lis.
  • 循环、递归、遍历、迭代介绍 循环(loop)–最基础的概念,所有重复的行为 a.循环算是最基础的概念,...迭代时函数内某段代码实现循环,而迭代与普通循环的区别是:循环代码中参与运算的变量同时是保存结果的变量...
  • 迭代和递归的区别

    2019-12-24 09:25:10
    迭代与普通循环的区别是:循环代码中参与运算的变量同时是保存结果的变量,当前保存的结果作为下一次循环计算的初始值。 递归循环中,遇到满足终止条件的情况时逐层返回来结束。迭代则使用计数器结束循环。当然很...
  •  迭代与递归各基于一种控制结构:迭代利用循环结构(for、while或do/while)、递归利用选择结构(if,if/else或swich)。迭代和递归都涉及循环:迭代清楚地使用循环结构,递归通过反复方法调用来实现循环。...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 612
精华内容 244
关键字:

迭代与循环的区别