00:00
开发的时候要注意什么问题?哪些是陷阱?老师呢给大家做一些介绍啊。来,我们首先来破除第一个观点,很多人说这个递归呢,它的效率比较低,是真的它的效率低吗?我们来看一看来吧。我们现在举一个例子,在SC中,他说循环建议不要用well,也不用do well,而是用呃,他是不建议用这个,那他建议用什么呢?用递归来完成。我们举个例子,求一到50的和,很简单吧,这个如果我们用常规的方法,同学们都能写出来。好用什么呢?我们用这个Y循环来来计算,因为这段代码呢,大家都能看懂,我就直接跑一下来吧,同学们,我们新建一个小章节,叫CHAPTER14。CHAPTER14,跟上思路。OK,那现在呢,我们看我们这个递归的。
01:00
这个叫递归的,递归的一个DEMO。我们呢,给他一个object。来走一个代码,我们先用这个常规的方式来做啊,大家看我们计算计算一到50的一个和使用什么呢?使用这个常规的常规的while循环来完成。来完成,OK,代码很简单,我们来看看这个代码大致是什么样子的啊,这我要引一个包,就是u u tr包,这个同学们以前在以前学过了,这个呢,在一个包再看这个代码呢,我这写个叫执行前的,执行前的时间。执行前的时间。OK,那这个时间呢,我就说出来了,下面呢,我定义一个result,这个用来存放我们计算的结果。存放大家看啊,存放计算的结果,我为什么整了一个big特呢,因为我担心他约见嘛,我想整大一点,因为一到50你会看出来,呃,看不出来效果,待会我要整个很大的数,好,这个呢,就是number呢,就是我们这个在不停。
02:12
相当于说那个不停这个叠加的一个数啊,这个是变化的,变化的一个数,变化的数,OK,那现在呢,大家看到big int,我先创建了一个big in是这么大,那理论上应该说如果按50的话,应该写个50,我故意呢给他整到这么大一个数,然后用while循环来统计结果,使用传统的传统的这个while循环,那么这个Y循环怎么做的呢?就是number,如果小于这个最大值,我就反复的累计。累积,然后这边是这个,这个叫变量的叠加,大家都学过的啊,变量的叠加,这个大家能看懂啊的叠加,那么叠加呢,就是它不停的加加加,最后呢,总会小于这个数,不就退出这个外循环了吗?好,最后这个结果我们输出在这,这是结果,那么最后呢,我再把这个执行完毕过后的时间也打印出来,来,我在这再输出一个时间。
03:10
那这个时间呢,这个no我们在得叫NO2,好,这个格式我就不要了,因为上面已经有这个格式了,来得一个date date2啊DATE2,然后这是闹闹二,然后这个叫做执行后的时间。就是执行后,执行完毕,执行完毕的时间OK,那么把这个时间呢打出来,OK,好同学们来,我们来算算传统的常规的这个外循环,从一加到了这么大一个数,一共花了多少时间呢?走一个走一个,我们看到传统的方法呢,他一共会去这么多次啊个十百千万,10万,百万千万也就9000万。那么这个时候呢,我们得到这个结果一共花了大概八秒钟,八秒钟没问题吧,好,这个我就先放到这啊,八秒钟我们统计到花了时间。
04:06
时耗时。耗时八秒。耗时八秒,这个大家有目共睹啊,八秒,好,有了这个八秒以后呢,同学们,我们再来写第二个案例,我们用递归的方式来完成这个,这个从一加到这么大的一个数,看花了多少时间来,我们再写第二个案例。OK,那么DEMO02。OK啊,注意听讲这个呢,也还是比较有用的,就是大家呢,可能以前听这方面少一点,都是技能性的东西,好同样道理啊,我呢这个呃,我就把这个代码拿过来用,很简单,我是怎么写的呢。大家看代码呢,就是用了一个很简单的一个这个字,我们把它拿过来。拿过来,OK,我这里写了一个函数,这个函数大家应该也能看懂,这是用递归的方式,递归的方式来统计,统计这个一加到加到谁呢?加到number的啊,加到number的这么一个和。
05:16
和当然这个家中间肯定有很多的地位,你看我怎么做的啊,我接收一个number,我接收一个number,再传进去一个sum。我没有用外部变量,我没有使用到外部变量,这样就保证了函数的纯洁性,就叫纯函数的特点,那么我怎么做呢?如果这个number小于这个值啊,当然这里也是有写了一个L啊,如果小于这个值呢,我就让他去递归的调用,怎么调用呢?再调用max,然后number加一,Number加一说把这个number加一个一再传给他,同时这个上呢,累计一个,是不是这个地方就在不停的变化了,最后呢,当这个number不停的加加加加加加到什么时候呢?加到不再小于它,我就把整个这个结果返回。
06:02
实际上就是用递归的方式来统计的,大家看懂了好,看懂过后呢,我们来测试一下它的效率。测试效率,OK,测试这个时间吧,测试这个耗费时间,测试耗时。耗时多少,那么大家看可以看到递归一一定会递归这么多次啊,9000万是吧,个一个十百千万,十万百万千万九千万是应该能够看出来他这个效率低还是高了,你毕竟递归了那么多次嘛,这个大家应该没有什么怀疑的,那现在呢,我们来测一下啊,测一下呢,我就要创建几个变量,我就不去写它了,因为很简单,我就把这个拿过来用一下。Very easy啊,你看我这仍然用一个number,这个number呢是用来传进去的,这个是累积的那个和,就是那个和,然后这边又调用啊,这边又调用,调用最后呢,把这个结果我们输出来了,好的同学们在执执行之前我打一个时间。
07:02
就是执行前列时间,OK,再来呢,写一个执行后的时间。执行后的时间,相信同学们在学,在大学学东西的时候呢,老师应该也讲过,递归相对效率比较低,应该一般老师都会这么讲一下是不是啊,OK,那么看看到底他到底跟那个传统笔法是慢多少,或者是怎么样呢?来老规矩,我把这个时间我就不写了啊,重新把它整到前面来。在这个执行之前呢,打一个时间。OK,然后呢,我在执行之后再打一个时间,这是我们执行之后的时间,没有问题,我也把它放到这。那么我们来看看他耗费多长时间看这个结果啊,结果是。OK,我们来看结果走一个好9000 9000多万次的一个递归会耗时多少呢?我们执行完毕,我们看看运行一下啊各位刚才18秒。
08:04
好,现在我们看它的结果已然出来,也是八秒。也是八秒,那至少说明至少说明这个递归本身并不是像我们那样,好像非常耗费我们的这个运力,就它本身呢,并不像我们想的那么那子,但是递归为什么很多老师说递归要小心使用呢,这个我在后面给他点一下,因为你递归用的不好的确会出大问题。会出一个很逼,一个比一个problem啊很大的一个问题,那么至于怎么出问题,我后面给大家分析,至少你现在从这得出一个结论,就是你如果这个递归没有乱用,它的效率和普通普通调用是没什么太大区别的,OK,好,那这个呢,我们通过这个案例就第一个就看到了,递归对速度呢,影响并不是很大啊,不大。对吧,不大,但是呢,为什么有很多书上就说递归要小心使用呢?的确别人说也没有说错。
09:06
那到底为什么,待会再说啊,那么这边又引出递归使用的一个递归使用的一个陷阱,我要说一下。这个陷阱很多同学呢,网上也没有,怎么说,到时候呢,我来提一下啊,陷阱如果你用的不好,的确会出大问题,会出大问题好地位陷阱是什么,待会再讲好,现在我把刚才讲的这一块先简单的板述一下,我们来说一下啊,我们刚才呢讲的一点内容,把它板述一下。我们首先呢,给大家说了一下递归的,呃,就是关于SC拉语言的基本介绍。好,我们讲了什么内容呢?诶首先呢,我们把这个GALA语言的特色再给同学们回顾了一下。对吧,诶他有的特点是这样一些特点。尤其是呃,在我们这谈到了呃,斯嘎拉的斯甘LA这个这个这个设计者哈马丁奥特斯基这个这个小伙子呢,对不对,还是很猛的,他喜欢这个语言是简洁高效,令人愉快的,对吧,确实是令人愉快啊,然后呢,第二个呢,我们又讲到了他的。
10:18
编程范式就SC提倡的这个,呃,递归思想去写代码的这种思想,好我们也把它写到这。那么他是怎么说这个事的呢?他说编程范式我们做了一个介绍。呃,编程方式有这么几个特点,先把它。标注一下第一个。编程方式我们先说现在最大的最流行,大家知道是面向对象,后面呢,我说了,面向对象不是一种严格意义的编程方式,准确的讲应该是命令式编程。还有函数式编程。对,还有一种叫逻辑式编程才是真正的范式,那么我们o op呢,它只是只是几种范式的一个交叉产物,对的啊,OK,第三种呢,我们说传统语言里面命令是得到强调,但我们这个递归出境的几率比较小,原因就是递归第一个比较难理解,第二个呢,大家认为用的不好会出现问题,好这个说完了以后呢,我们就来举了一个例子,我们我们举这个例子呢,就是来体验了一个求和的案例,好这有应用案例一,我们就有了。
11:34
好,应用案例一来一个。那么这个应用案例,应用实例,我们先讲了一个什么呢?诶,我们。用这个方式来解决了他的一个求和问题。对好,首先呢,我们在这提示了这个观点,对吧,诶这个地方我们写一个,呃,标题应用实例。应用实力。要求计算它,然后呢,常规的方式,这边我们用这个常规的和这个递归的方式来解决了。
12:08
常规的方式,先看了一下执行的效率。那么常规的方式我是这样写的,耗时八秒。常规的方式,我们写到这来,他一共呢,花费了18秒钟说明。呃,说明呃,常规的方法,常规的方法我们使用了八秒,用用了八秒。OK,那么现在呢,我们又紧接着用递归的方式来解决它,对递归的方式呢,来解决了这样一个代码。OK,结论我也拿到了。OK,好,这边我们用递归的方式来解决了,最后呢,我们得出结论是,呃,影响的效率并不大,但是呢,递递归有使用陷阱。OK,那具体来说,我们是怎么实现这个递归来计算一加到N的?
13:05
以这个这个方式呢,我这写了一段代码给大家拿过来。好拿过来,拿过来过呢,我们把这个标标起来啊,就这个函数是这写的,在这里写的在哪里呢,就这。就这个。好。好,那关于我们这个递归来求和,以及它的时间呢,我们发现呃,就是这个这个情况影响并不大,截取一段视频。
我来说两句