zoukankan      html  css  js  c++  java
  • 循环,迭代和递归

    循环(loop)

    指的是在满足条件的情况下,重复执行同一段代码。比如,while语句。

    迭代(iterate)

    指的是按照某种顺序逐个访问列表中的每一项。比如,for语句。

    本质:利用计算机运算速度快、适合做重复性操作的特点,让计算机对一组指令(或一定步骤)进行重复执行,在每次执行这组指令(或这些步骤)时,都从变量的原值推出它的一个新值

    循环与迭代的异同

    循环和迭代的共同点在于,它们都是在描述一个多次操作。

    不同点在于,循环侧重于描述每次操作和上一次操作【相同之处】,而迭代侧重于描述每次操作和上一次操作的【不同之处】。

    递归(recursion)

    指的是一个函数不断调用自身的行为。比如,以编程方式输出著名的斐波纳契数列

    递归与迭代的异同

    递归的过程中, 问题的规模在缩小,这样最终得到问题的解;而迭代是一种由远变近的逼近,问题的规模不见得缩小了,但是慢慢在调整接近答案

    递归求解n的阶乘过程,非常符合这个描述;而数值分析课程里的许多方法,比如牛顿迭代法,也是符合这个描述的。

    三者的优缺点

    循环的缺点就是不容易理解,编写复杂问题时困难。优点是效率高,运行时间只因循环次数增加而增加,没什么额外开销。空间上没有什么增加。

    迭代是逐渐逼近,用新值覆盖旧值,直到满足条件后结束,不保存中间值,空间利用率高。

    递归其实是方便了程序员难为了机器。它只要得到数学公式就能很方便的写出程序。优点就是易理解,容易编程。但递归是用栈机制实现的,将一个问题分解为若干相对小一点的问题,遇到递归出口再原路返回,因此必须保存相关的中间值,这些中间值压入栈保存,问题规模较大时会占用大量内存。每深入一层,都要占去一块栈数据区域,对嵌套层数深的一些算法,递归会力不从心,空间上会以内存崩溃而告终,而且递归也带来了大量的函数调用,这也有许多额外的时间开销。所以在深度大时,它的时空性就不好了。每次函数调用都要压栈,那么空间复杂度是O(n),和递归次数呈线性关系。

    遍历

    遍历:依次对集合中的每个元素做且仅做一次访问。依次,代表具有某种顺序。比如二叉树有三种前序、中序、后序遍历。数组有顺序、逆序遍历等等。

    有趣的比拟

    迭代——《明日边缘》
    递归——《盗梦空间》

    买玩具

    【循环】

    你去小卖铺买了一个玩具,拿回家后孩子不喜欢,你也没问他为什么不喜欢。然后你又去同一个小卖铺买了一个玩具,拿回家后孩子又不喜欢。。。如此往复 10 次,孩子才满意。

    每次去买玩具的目标、行为都一样,这叫循环。

    【迭代】

    你去小卖铺买了个一个玩具,拿回家后孩子不喜欢。你耐心的询问后得知他喜欢乐高的玩具,于是你就去大超市给他买了乐高,回家后孩子还是不喜欢,耐心询问后得知他喜欢乐高玩具中最贵的那个玩具,于是你就去奢侈品商店给他买了乐高限量版玩具,拿回家后孩子很满意。

    每次去买玩具都跟上一次不一样,或是有了新的目标,或是缩小了搜寻范围,这叫迭代。

    【递归】

    你自己不太了解小孩子的需求,为了缩小范围,让你的儿子去给孙子挑选。儿子比你强点有限,但依然不太了解小孩子的需求。为了缩小范围,你又让你孙子去挑选。如此这般,直到找到合适的玩具。

    【遍历】

    爷爷去玩具大厦给孙子挑选玩具 。玩具大厦共4层,分布着若干玩具店铺。爷爷必须把所有玩具店都逛一遍,才能挑选出最好的玩具。爷爷可以先从4楼开始往下逛,也可以从1楼往上逛,还可以按照3楼、1楼、4楼、2楼的顺序(爷爷有他自己的想法……)。不管怎么逛,只要保证 每家店都去过一次、不重复去,那么就可以说是遍历了玩具店集合。
    (整理自网络)

    参考资料:

    https://blog.csdn.net/u014775977/article/details/53930052

    https://www.zhihu.com/question/20278387

    Min是清明的茗
  • 相关阅读:
    【WCSF】DynamicMethod 的类型所有者无效解决方案
    关于微软企业库查询语句db.ExecuteNonQuery(cmd)返回1的问题
    ASP.NET 如何取得 Request URL 的各個部分
    CSS模拟HTML滚动条
    JavaScript Madness不同的浏览器的keycode比较
    手机身份证IP地址开放接口
    sql添加数据后返回受影响行数据
    jquery下removeClass(“oldClassName”).addClass("newClassName")的问题
    躺着看书!这是所谓 "躺着就能长智慧" 吗?
    在web开发中使用dynsrc被McAfee报木马病毒的解决
  • 原文地址:https://www.cnblogs.com/MinPage/p/13992040.html
Copyright © 2011-2022 走看看