00:00
下一个呢,要讲我们这个集合操作里面特别有用的,但是理解起来还有点麻烦的一个东西叫什么呢化解。化简嘛,就是把这个东西简化的意思啊,什么意思呢?我们还是来看一个具体的需求,这个需求是如此这般的啊,说我这里有一个历史的集合,有这么一些数,我要求求出历史的和的,这就说把它的和求出来。当然这个对于我们来说太简单了,你传统的方法就是便利,把它加起来累积就完了,但是人家不让你们干,如果再像那样写,就不是SC的写法了。那是看他怎么做的呢?它是这样玩的,它是什么呢?首先要明白,化简是将二元函数引用,引用于集合中的函数,什么叫二元函数?做一个解释,二元函数简单的说就是接收。接收两个参数的函数啊,就叫二元函数。理解啊,那么上面的问题当然可以用便利的方法解决,但是我们用SC化简来写一下,那么SC化简它是怎么玩的呢?非常简单,它有一个函数叫reduce。
01:09
我把这个放大一点,先做一个说明,我们再写。在SC里面提供了一个方法,叫做reduce。Reduction,那么这个叫化简,简单的说就是从左开始化简。那么化简它是这个函数做什么事情呢?我这里总结了五句话。注意听一下啊,五句话前面有些大家已经很清楚了,第一个reduce left呢,它要接收的是是这样两个,呃,它要接收的是两个参数。两个参数,那么从这看到啊,它接收的函数的形式是这样一个形式,就是呃,这个op就是刚才我写的一个F了,相当于它可以接收两个参数,这因为你是二元函数。所以他接受两个参数,两个参数做完以后会返回这个B,就返回一个结果,那么这个结果呢,会作为这个下一次调用的第一个参数,左边这个参数,你看我这写的很精确啊,就是他要接收两个参数,然后返回一个结果,这个返回这个结果呢,还会作为下一个参数传入到这个下,在下一次这个调用的最左边及第一个参数,那我这写写出来看清楚啊,Reduce是left f运行的规则是从左边开始执行。
02:31
从左边开始执行。将得到的结果返回给第一个参数。继续调用,那么第一个参数呢,就是左边的参数,所以为什么管它叫做。Radio left呢,就是它是反复的一个调用及底层是在递归。所以再次体现斯卡拉喜欢递归这个特点,那么然后继续和下一个元素进行,将得到结果,继续返回第一个参数,继续执行,以此类推。所以说我们这一段代码呢,先给大家跑一下,然后我们再讲它的这个需求啊,来来,我们先直接给大家把代码走一下,这个代码呢,我省点事啊,同学们,我就直接把这个拿过来写一下就可以了。
03:15
好,现在我们讲的是reduce reduce,好,写到这里来,就简化reduce reduce啊,DEMO。零一来写一个小案例,那re DEMO呢?它是做一件什么事情呢?好,首先把这个代码删过来,我把它求和。好,我们现在需求是使用使用化简的方式,哎,化简化简的方式来。计算,计算历史的集合的和就是这个历史的。啊,历史的这个集合的和那也很简单,怎么做呢?大家看,我先把这个函数啊拿到外面去,其实写到里面也可以啊,写到外面吧,统一的好管理,然后呢,我就直接来玩了啊同学们看,呃,代码是这样写的,就list。
04:08
点reduce,呃,它一共有三种啊,一个是reduce right,一个是reduce,一个是reduce left,那么我们先说第一个reduce left,然后呢,要做的就一件事情,把上传进去就完事了。好,这样呢,大家你看这个前面要没有这个基础在这撑着的话,大家可能就现在听着有点有点空了,不知道到底是怎么回事,好,我把这个结果拿出来大家看一下。先直接看结果,然后再说它是怎么执行的啊,来看看这个结果等于多少呢?加它必然等于,如果说不出问题的话,它应该等于60,因为一加20加30加四加五应该等于60,我们先看这个结果对不对,我们运行一下,我们运行完了过呢,我发现这个结果跟我们想的应该是一样的60,那它是怎么执行的呢?来同学们注意一下它执行的流程,做一个简单执行的流程分析。
05:07
流程分析。他执行的流程呢,其实是这样子的啊,就是它会把我我直接这样写啊,步骤步骤一他先这样算,先把这个一。加。20算出来。他先把一加20算出来,因为你给这个上午传的时候呢,第一次传的是一和20,从左边开始执行,所以把这个结果呢,会作为上午的第二次调用的。第一个参数再说一遍啊,他会把这个第一次预算的这个结果作为第二一次调用上午的。第一个参数传进去,因为是左左边开始简化好,这个做完了以后呢,他紧接着做第二步。步骤,因为它还是底层,也是有个递归和一个呃循环的过程,第二步他做什么事情呢?把这个拿到的这个结果啊,我就保留一个流程啊,再跟第下一个参数,就是这个参数去算,就是它会把这个结果呢,传入下一次上午的一个就相当于就是21。
06:18
和30啊,为了看到这个流程呢,我保留了这个计算的这个形式,好下一步就依此类推,我就快速的走一下啊,下一步呢,他会把这个结果。又作为第在下一次调用上我的第一个参数传进去,相当于把四传进去了,好再下一步就是第四步,所以说同学们可以算出来,它一共调用了四次sum函数。好把这个呢,又作为一个结果。传在下一次调用上部的时候呢,再调用,然后传出这个,最后这个结果呢,就等于。我们的60,所以说从这个推断出来呢,我们这个sum它一共调用了1234次,那么我们看看到底调用了几次,证明一下这个事情。
07:06
Some被调用。它底层是在。做这个操作啊,被调用好,我们来玩一把,我们执行一下呢,我们可以看到这个函数会调用了好几次啊。可以看到的确跟我们分析的完全一样,一共调用了四次,而且执行的时候呢,它这个呃,历史的底层reduce底层呢,会遍历这个历史的,然后呢,他第一次传的是嗯,一和20,把这个结构拿回来再传给上,其实就是一个递归。底层就是个地归,所以说为什么我说递归在里面用的特别多,如果你不懂递归的基本机制,那你这个SC是很难学精通的,可能就学一个表面说为什么我在前面讲那个递归的时候,说大家一定要好好理解它,就是咱们算法,一个是递归,一个就是各种数据结构,好啊同学们,这个流程我就分析到这里了啊啊其实也不难,要从难的角度呢,也不难,好各位朋友,那现在我把这个化简,这个呃左向左化简呢,就给大家板述一下。
08:08
好,先把这个需求拿过来。好,同学们,现在呢,我把它进行一个简单的板书,叫化简。化简呗,化简。OK,那这里给他一个标题二,标题二那我做了什么事情呢?诶,我先让大家看了一个需求,引起大家思考。然后呢,我对这个化简做了一个基本的介绍,诶化简的介绍。为键,呃,可以化简呢,就是呃,化简就是将二元函数引用与集合中的函数,说白了就是把一个二元函函数传给我们的reduce left。啊,这个二元函数要理解一下什么意思啊,就说我们这个化简呢,它只能是按照这种接收两个参数的形式来调用,如果你是多的,那就不行了。
09:00
啊,多的不行,多的话你可以传几个集合进去,在集集合里面再去想办法。好,那么现在这个代码呢,我们就写完了,那么具体的代码啊,代码解决,代码演示,好同学们,代码演示给大家写到这里来,标题三。啊比具体代码呢,我们直接放到这里来。放哪里呢?就放在刚才我们写的啊这个位置干嘛。打过来。好,给同学们板书到这里。啊,这是我们的代码,后面呢,对这个运行机制我们还有点说明啊对。对什么呢,对。Reduce left的一个的运行。过程或者机制的一个说明。啊,但我们这儿说了什么东西呢,大家应该还有印象哈,我在刚才呢,在幻灯片里面总结了有这么五点。哎,总结了五点,大家看一下就行了。这这这个地方我就不再不再一个说了啊各位朋友,第一个我说了一下,它底层对应的这个高阶,呃,有一个高阶函数reduce,就是一个高阶函数。
10:07
啊,可以接收一个函数吗?就就是一个高级函数了,好,然后呢,这个流程我也做了一个简单的描述啊及是这样一个过程啊,只是我这写的12345上面呢,呃,我写的是这个1243445啊这个你应该能够反应过来,好同学们那关于这个化简的基本介绍,我们就说到这里。
我来说两句