[路飞]_算法·每日解读--迭代,递归、遍历和循环到底有何不同?

619 阅读5分钟

「这是我参与11月更文挑战的第9天,活动详情查看:2021最后一次更文挑战

编程了很多年,有时候会有一种恍惚的感觉 ” 我的人生好像也在递归、迭代和循环中不停的跳转“

那么,作为一个程序猿,你真的理解什么是递归、迭代和循环吗?

【今天我们就来详细的介绍一下他们三个到底是什么gui

1、循环[ gui ]的特征:

  • 循环的本质,就像一个迷宫,你在这个迷宫里面去探索每一种可能,直到你找到出来的路!
  • 而在编程当中,便用两个单词来决定了循环:一个是for(为了,给)、一个是while(当……时);而在这里的出路是指定的,也就是为了谁我愿意去循环,当什么时候,我愿意从循环里出来!
  • forwhile的基础上,我们又设计出了更多的玩法,比如:do-while、for-in、for-of ; 当然,除了循环,我们还有自己的奢求【我想怎样就怎样】,然后就诞生了循环的控制手段:break、continue;

具体的语句特点解读:

  • 循环的特点:谁的心要改变(变量)==> 什么条件下发生改变(条件) ==> 你好抓心(循环体内操作) ==> 我可以改变了(改变变量) ==> 不能再满足我,say拜拜(结束,抛出内心的一切);
  • whilefor循环的特点:先判断,后执行(你够不够格,不够不要走进我的心里)
  • do-while循环的特点:先执行,后判断(它先进来看看,行不行它说了【至少有一次机会】)
  • for-in循环:遍历对象的常用方法for(keys in Cars){……} keys只能表示键值对的键名,要想获取objectval,只能通过keys的方法去获取obj[keys] ==> 特殊功能,原型判断obj.hasOwnProperty(keys) == true
  • for-of循环:遍历所有数据结构的统一方法,获取对象的键值,(Symbol.iterator方法)使用的范围:SetMap结构、某些类数组对象(arguments对象、DOM NodeList对象)、字符串、Generator对象;

for-infor-of 的独特之处:

for...in循环   ①数组的键名是数字,但是for...in循环是以字符串作为键名“0”、“1”、“2”等等。   ②for...in循环不仅遍历数字键名,还会遍历手动添加的其他键,甚至包括原型链上的键。   ③某些情况下,for...in循环会以任意顺序遍历键名。   for...in循环主要是为遍历对象而设计的,不适用于遍历数组。

for...of循环   有着同for...in一样的简洁语法,但是没有for...in那些缺点。   不同于forEach方法,它可以与breakcontinuereturn配合使用。   提供了遍历所有数据结构的统一操作接口。

  • breakcontinue 的分道扬镳:

break 跳出本层循环,继续执行循环后面的语句。     如果循环有多层,则break只能跳出一层。 continue 跳过本次循环剩余的代码,继续执行下一次循环。     ①对于for循环,continue之后执行的语句,是循环变量更新语句i++;     ②对于while、do-while循环,continue之后执行的语句,是循环条件判断;

因此,使用这两个循环时,必须将continue放到i++之后使用,否则,continue将跳过i++进入死循环。

2、循环?不够!递归来凑”giaoqi“

曾经在网络水文中有过这样的故事来描述递归的含义:”从前有座山,山里有座庙,庙里有个和尚,和尚在讲故事,从前有座山,山里有座庙,庙里有个和尚,和尚在讲故事,从前有座山...“。忽然觉得,这个小故事和递归的含义倒也贴切的很

抽象的理解:递归如同两面相对的镜子,你中有我,我中有你,有很多很多!但是,严格来说这并不是递归,也不是我们想要的递归(无脑循环下去也就是我们说的走不出去的死循环),因为递归类属于循环,但是它所执行的确实函数的复式调用,在这里存在一个终止条件、一个递归调用函数;而且递归的过程存在前行退回阶段,也就是先执行调用函数前的内容,直到执行完内部调用函数最后一项跳出时,再执行调用函数后的内容。

enterReturn.jpg

图片来源——Pushy

//经典代码示例
function Recursion(depth){
    console.log("抱着");      //前行阶段
    if(!depth){
        console.log("我的小鲤鱼")    //结束后输出
    }else{
        Recursion(--depth);  //递归调用
    }
    console.log("的我")       //前行阶段结束
}
console.log("吓得我抱起了")
Recursion(2)
吓得我抱起了
抱着
抱着
抱着
我的小鲤鱼
的我
的我
的我

3、迭代是什么gui?

迭代是重复反馈过程的活动,其目的通常是为了逼近所需目标或结果。每一次对过程的重复称为一次“迭代”,而每一次迭代得到的结果会作为下一次迭代的初始值!(重复执行程序中的循环,知道满足某条件为止)

通常情况下,更接近于for语句的功能实现。

4、遍历

遍历指的是按照一定的规则访问树形结构中的每个节点,而且每个节点都只访问一次。

更多美文,解你迷惑:二叉树的三种遍历方法 复制带随机指针的链表