00:00
好,我们先把这个idea打开,OK,然后呢,把我们的这个上次的作业先做一个点评,对吧,上次课的作业先做一个点评。作业呢,都比较简单,我们来看一下吧。好,稍等一下啊。把幻灯片这些打开啊,把幻灯片打开。嗯。好的,我先把这个,呃,因为要评奖作业,要评奖作业的话呢,我还是切换到我们原先的那一个项目,对不对,就是scanner,呃,0725。
01:06
好,先切过来。切过来,我们先把作业评讲一下。OK,在这里啊,在这里。干,然后呢,待会的话,我把这个作业就放在CHAPTER16里边,我们来看一下这个作业吧。呃,他说第一个题,他说利用模式匹配,模式匹配编写一个swap这么一个函数。呃,干什么呢?接收一个整数的对偶,呃,整数呢,就是说,呃,相当于说对偶里面的元素呢,都是int类型,返回对偶的两个组成部件,互换位置的新对偶,那这个太简单了,就是匹配,然后kiss一下返回,这个应该是没有任何难度的,但是呢,大家一定要注意,这个队友在写的时候呢,诶,你这个队偶的类型要这么去写。啊呃,这个队友类型如果是如果是真的全部都是in特,你也可以直接这样写也行,就是你如果说想简单一点,不想用这个泛型,直接写成这个int也是可以的,就直接这写两个int,那前面这个两个人把它去掉啊,我这呢,呃,就是说呃,把它做的更灵活一点,OK,我们来测一下吧,这题因为很简单,我们就直接拿来测一下。
02:22
好,我们还是老规矩,在CHAPTER16里边,我们新建一个包包,叫homeworker。Homework,我们都看一下啊。来走一下,那这个homeworker呢,我们的第一个练习,我新建一个文件。ERC0101,来个object。OK。好,然后呢,我我们把这个写到这,我们先把这个需求拉过来,需求他要求我们写一个函数,具体来说这个需求呢,就是刚才我们看到的这这句话。
03:00
对,就这句话啊,OK,很简单的一句话。OK,把它放到这,那怎么写这个东西呢?非常的简单,咱们DF。OK,写个函数是吧。呃,LA呢,前面这两个泛型对吧,一个T泛型这个名称呢,就是你自个可以自己去写写,然后呢temple,然后后边咱们写啊TS啊TSOK没问题,然后拿完了过后呢,我们要进行一个匹配,这段它返回啊,它是有返回值的,那既然有返回呢,我们也把它的这个类型对不对,也给它写进去啊,或者是不用管它,用这个类型推导是最简单的,你就不用写它了,那这边我们就match谁呢这个top。A match,那match它,呃,如果case对吧,匹配,那匹配到什么了呢?匹配到一个AB,这两个变量呢,就是你自个写的,以前我们讲过,就是说如果你这写的变量呢,默认就是我们所说的case中的那个变量匹配,他会把你传进来的这两个指令,就temp里面的这个A,那个第一个值给A,第二个值给B,然后完了过后呢,我们直接将其交换位置就可以了。
04:18
啊,当然如果说,呃,如果说没有没有到的话,你也可以给他一个新的提示,对吧,你说没有匹配到也可以啊,没有匹配到,没有匹配啊,没有没有匹。配到OK,好,那么这个写完以后呢,我们来用一下吧,用一下也非常的简单,咱们呢,就是这样写swap直接掉。啊,前面这个范型咱们就不用写了,直接给他一个与呃对偶元组,比如说十二十,他不要两个整数吗?对,然后我也不啰嗦,我就打一下就可以了啊,我也不去接他了,打一下我们看看返回的队友是不是20和十就可以我们运行一下。OK,没有任何问题,很简单。
05:02
跑起来,我们看到呢,它返回的就是20和十。哦,第一次稍微慢一点,大家稍等。好,我们看到这个返回的结果呢,是20和十,所以说我们用这种模式匹配可以非常轻松的交换两个数,甚至是任意数的这个位置,Very good啊,很简单,第一个题咱们就说到这里,我们来看第二个题,他说利用模式匹配编写一个swap函数,交换数组中的前两个元素的位置,前提条件是数组长度要至少为二,来我们一起写下这个函数。也非常的简单,我们新哎,我们新建一个啊,前提是要大于等于二,那大家想一想应该怎么去思考这个问题啊,OK,末模式匹配。呃,我新建一个scanner。A exer cc02。啊,Object同样道理,我们写一个主方法,然后把需求先放过来,那就写吧,Swap swap,然后这边呢,他说要去匹配啊,就是传一个数组,那我就直接接收一个数组就可以了,啊,接收一个数组,那这个数组呢,我们认为是一个N令类型的,因为他没有说,他没有说是什么类型,我就是一个令没问题。
06:27
同样我们让他使用这个类型推导,类型推导,那么这个AR瑞他说交换前两个元素的位置,对吧,那这个很简单,咱们呢,用那个数组匹配,数组匹配我们以前讲过的case。Case,如果说他这个数组有两个,一个是first first first,然后呢,Second。SE后面呢,我们以前讲过后续的匹配,我讲过一个rest,然后艾符号下划线芯还记得吧,哎,我以前讲过的啊,然后呢,人家要求前两个位置变化,那我现在因为我写的有两个说,说明这个数组呢,至少有两个才可以,那后面我们返回的时候呢,就这样返回,把前面的second的a second。
07:23
Second SE和这个,然后first进行一个交换。FIRFIRST。I if I。D好,交换完了过后呢,拼一下,把后面这个rest给拼过去,OK,好,这样呢就返回了,那如果说呃,如果说它嗯没有匹配到怎么办呢?我们就原封不动的把这个给他返回,就是相当于说没有交换嘛,不满足条件我就不去动它就可以了,一一,他说前提是长度必须大于二,那如果不大于二怎么办呢?我就不交换,原封不动的给你返回就可以了,好,我们简单的测试一下啊各位同学,呃,也很简单,Swap,呃,我就随便写一个数组吧,数组类型呢,无所谓,那我就。
08:16
随便写一个,比如说12HELLO212哈类型,他没有做这个,呃约束呃,那么我们这边一执行呢,它应该返回二一哈就可以了,非常的简单,好,我们看这边有个问题,哪哪出错了呀。Swap哪些错了?啊,是不是我这边。呃,我看看是不是换一个名字看看这有问题吗?哪写错了?他说,第十行。这个有问题吗?我们换一个。哟,这一帮来,我们换一个名字啊,看看是不是呃,名字有冲突。
09:03
写个二。好写个二,我们再执行一下,我们再执行一下。好,还是有问题,还是有问题,我们看是哪个地方出了问题了,应该没有哦,是不是我们这这忘了写麦值匹配了呀,是不是忘了写这个东西了。哎,我们这忘了写了这样一个东西,直接拿来用,那哪行呢?诶容易犯这个错误啊match忘写了这个,有时候你写久了过后很容易跟他把那个偏函数的使用混在一起了,对。刚才没有直接我们直接拿来用了,没有把这个match写上去啊,问题是在这里直接。好,执行完了过后呢,这个结果就对了,刚才我们把这个偏函数给它混在一起了,好这个打出来看不到,咱们怎么办呢?很简单,我们来一个make,呃,这个To Buffer一下也能看到效果,To Buffer呢就诶等一下啊,这个地方打错了,应该是在这个位置,对吧,To Buffer,诶,因为你整个返回的呢,才是一个这个,然后再To Buffer。
10:11
走执行,那执行完了后,我们可以看到这样一个效果,对吧,二一哈,那如果说你这个长度不够,假如说啊,我就我就原封不动的给他写个A是汤姆,还有一个Jack。好,这两个呢,呃,假设只有一个,假设只有一个汤姆,那这个就也不存在交换了,他就原封不动返回,我就不去写了啊好,这是第二一个练习题,我们来看第三个练习题,第三一个练习题呢,我们来简单看一下,他说呃,编写一个函数计算list list里面的泛型是什么类型呢?是这个类型。这里面放的是option option里面呢,他说了计算所有非论值的和不得使用match语句,那这个地方其实很简单,我们以前学过一个东西叫做get or less,把这个用上去就可以了,遍历一下其实就是一个便利,便利过过后呢用这样一个操作就是。
11:16
点get worse,那就是如果是那个N呢,就等于零,否则就加上它的一个值啊,其实就是这么一点东西,用了一个map的操作,那我们直接看一下这个结果啊,非常的简单,我把这写一下拿过来用,呃,你看我这有一个list的这边。就是接收一个历史的option,然后呢,便利便利什么呢,我我把这个拿过来给你们讲一下啊,来整一个把它拿过来,我们写第三个练习。学一个第三个练习。Exer ci03。CI03来一个。好,我们把它写到这儿,来看一下这句话是怎么写的啊,他的需求,需求是返回非论啊,返回飞。
12:12
飞。OK,非嫩的这个和。那这个地方呢,我们可以看到它这个本意是什么呢?大家看这句话什么意思,怎么理解啊,同学们看,我们可以这样去比对,大家一下就明白了,你看啊,我们假如把这个拿掉,我们点map。点麦,不过我们看这里传的是什么,这里面传只option in,因为你这list里面放的就是这个option list,所以说他如果说严格的讲呢,应该是这样写的X。Option大家看一下啊,我把这个写一下option。然后呢,里边写上这个int。然后这边是它的一个类型,然后里边呢,我们应该怎么写呢?大家看这是我们的,这是它传入的行参,这边是我们的相对说逆名函数的函数体,那函数体应该怎么整呢?因为人家说了返回非嫩的,那也就是说。
13:14
如果就是很简单,就是X。点get or less写个零。就是如果能得到呢,就返回你本身的值,如果得不到呢,就返回一个零,大家看清楚没有,这句话应该能看懂吧,就说如果得得到就返回你本身的值,如果得不到,默认返回一个零,我们以前讲过这个玩意儿。那什么时候才能得到呢?就是因为就是我们就是你如果不是嫩,它就会返回本身值,如果是嫩的话呢,它得不到吗?没东西嘛,那就返回一个零,返回零过后呢,我对这个返回的结果再求一个sum就OK了,那我们来写一下,我们来写一个啊,我先写个list啊,这个集合list等于什么呢?这里面放的是list,这样一些东西我就扔进去了。
14:09
它里面放了什么玩意儿,我们简单看一下啊,它应该是这样,Some是option的这个子类,因此呢,你可以在里面写1OK or some,就是因为这些都是里面的东西嘛,就一个个的写,比如说来个三。好,假设来一个嫩,好,我们再来一个sum,等于。啊十假设是十,我就再来一个就行了啊,不写那么多了,那这个时候他会怎么办呢?在如果我把这个历史词传给这个sum。呃,传给这个项目过后呢,他就在里面去求啊,把这个传进去便利里面的值,便利的时候怎么便利呢?就是get wall类,如果some姆拿到一就是一,如果some姆拿到就是零,最后这个集合,整个这个集合会变成一个什么集合呢?
15:00
大家应该能吹出来,大家看是不是返回来的,整个老师高亮的部分返回的集合就是130100,看清楚没有,然后就像这个名字呢,取得有点不好,假设我叫my son可能可能更更好一点,因为呃,大家可能会把这两个上混在一起,好,这样就OK了,那现在呢,我们简化,你看啊这因为你这种写法太啰嗦了,我们以前讲过简化,因为你这边可以进行类型推导,所以说这个类型呢可以拿掉。这是第一个可以拿掉,第二个,因为你这个X在这边只出现了个一次,好,于是这边呢又被拿掉,大家看清楚了。OK,待会呢,我还要给大家评讲那个最经典的题,那个题呢,学我那个题评讲完了,我感觉大家整体应用会上一个,呃,就说相对来说更灵活了,就是认识的更深刻了,好你看一简化,简化完了我们再来用一下啊,我就直接my sum把什么传进去呢?历史是传进去,好这个地方就应该返回一个14就对了,如果不是14,那么我们答案是有问题的。
16:10
好,我们执行一下,我们发现呢,返回的的确是事实,完全没问题,好,各位朋友,我们紧接着再看下面一个题,这题都不难啊,同学们都特别简单。他说编写一个函数叫compose,就是合并,合并在一起干什么呢?这个题主要的难度是在于读懂它的含义本身这个东西很简单。那我们看它的题是什么呀?他说将两个类型为这样的函数。组合在一起什么意思呢?就说有两个函数,呃,都是接收一个double,返回一个option double这样一个结果的函数,它干什么呢?它要返回,把这两个函数整合在一起,怎么整合呢?产生另外一个同样类型的函数,他说两个函数合在一起,返回一个新的函数,这个函数可以干什么呢?如果以如果。
17:09
那两个函数里面的有一个函数返回一个嫩。则组合返回论,例如这样一个情况,大家看这里这句话呢,你要读懂啊,这两个就是它给的这两个函数,一个是F,一个是G,怎么样呢?如果传了一个,我这写一下啊,就是。把这个题读懂。这是他给的第一个给他给的啊,他就说他不说有两个类型吗?这是他给的第一个函数,就他给的D给的。OK,不着急给的第一个第一个函数,这个函数干什么呢?就是呃,可以接收一个double,返回的是什么呢?这是它的函数题,这是它的函数体,函数题是怎么做呢?如果大于零就返回这个东西,否则呢,就返回一个嫩。
18:00
这是他给了第一个函数,好,我们看一下这次函数,第一个函数我们有了,紧接着呢,他又给了第二个函数,他又给了第二个函数,给的第二个函数,这第二个函数呢,也是我们要准备整合的啊,第二个第二个函数,第二函数呢,他说如果X不等于一。如果X不等于看懂了啊,X不等于一,就返回这么一个值,呃,如果,呃,如果是等,如果是呃,等于一呢,就返回一个N啊,大致就是这样一个含义,好,最后他给了一个格式,就是你写成写出这个compos,然后把这个F和G传进去。当然这个compose呢,肯定就是一个高阶函数了,这个compose就是他把这个形式给你给你了,就是这个compose就是我们要写的,这个compose是我们要写的,我们需要完善的或者要完成的,它是一个什么呢?它是一个高阶函数。
19:01
它是一个高级函数,为什么它是一个高级函数呢?它可以接收两个呃函数,呃两个函数人家都已经把形式给你了,然后返回的肯定必然也是个函数,这肯定是个返回了一个匿名函数,对吧?很简单很简单,然后呢,人家又给了一个案例,他还给了一个案例,这个题主要是在读懂题,很难。就是他这个意思啊,这是他给的一个案例,他给了给出了给出一个案例,这个案例是什么呢?如果我将来传了一个二,返回的就是上一。如果给的是一和零,返回的就是嫩,看清楚了啊。那现在应该怎么去理解这个题呢?其实就是两个,将这两个给出单数合在一起。返回了一个H,然后这个H呢,相当于两个函数一起用,而且人家给了案例了,好,我们来简单的看一下这个题应该怎么做啊,其实挺简单的,怎么做呢,你看前面这两个我都不说了,这是我们给的,我写一下。
20:03
好,我们练习一下X204EXER c04ok。把它放这儿,放这儿。好,那么第一这两个函数是事先给好的,我们这需要引包啊,我们引下包就是scanner.me好,我这能一次性的把它引进去就可以了,这是给出的两个函数,看看懂了啊,我就不写了,给出的两个给我们的两个函两个函数,呃,而且呢,你看也知道是干什么事儿,现在呢,我们要合并成。啊,根据根据需求合并啊,合并合并成一个函数啊,但这个函数人家不是说乱让你合并的,人家给要求了,什么要求呢?就这个要求。这是他给出的形式,就是你要合并的,最后这个形式是这样子的,第一个是形式为这个格式。
21:05
第二个呢,他还给了一个案例,他给了一个什么案例呢?就是刚才给的这个案例,这个案例很有用啊,这个案例如果你没有看懂的话,你不知道怎么合并这个案例呢,相当于说他给了一个案例,就是你要类似于这样,那那你们看啊,传了一个二,他返回的是那一,那么你看什么情况下给了一个二,它返回的是上一呢。其实是这个G函数返回的,看没有,你们看懂了吗?你看啊,因为理论上说这个H如果是,如果是F这个函数返回,那它应该是返回的这个。那这个square这个进开平方对吧,这个地方呢,那这个二进开平方的话,这个肯定就不这个值了,哦不是这个,因为double嘛,那肯定是个小数,所以说它应该是走的走的这个走的这个G,这个函数这个你要看懂,从这呢,我们可以看出来,它这个地方走的这走的是走的是这个G函数走的这个G。
22:08
啊OK,那既然有了这这几个条件,咱们就OK了,很简单,我们把这个呢拿过来给大家看一下,非常的简单啊,就是这有一个东西我们来看一下是怎么完成的,好,所以前面这两个大家看懂了,就是他的行参的格式是他在哪给的呢?是他在这给的,他已经在最先前就把这个格式给我们了。啊,格式给我们了,给给我们过后呢,我们合并,你看这进行一个简单的一个匹配。就简单的一个匹配,就说传进来一个A,这个地方是返回了,看懂啊,这是返回了一个匿名的函数。哦,那么这个逆运函数,这是它的行参。因为他说了嘛,仍然传的是double,这个是它的函数体,你可以理解成是这样一个德式德行,你可以认为是这样子的,那么这个函数我怎么合并的呢?大家看我怎么合并的。
23:03
我正式开始合并,合并人家收了,人家刚才说的很清楚,你看人家提说的很清楚,他说他说只要有一个函数返回嫩,则组合函数返回论这句话,这句话就体现在我这儿写的if。我这个衣服是怎么来的?因为他说的,如果有一个反函数返回,N就组合就返回了,你看假如FX传进来是N,或者GX等于零,我就反回来,所以第一句话就满足了,第二句话为什么我写的是GX呢?为什么写的是GX?因为同学们刚才看到,如果他。是走的二,其实他走的是上,所以说我这就写的GX,当然这个题呢,大家也不用过于的去纠结,它主要是考察一个什么知识点啊,就是考察你能不能够写一个高阶函数,把另外两个函数用起来,其实这个提议,比如有时候老师我反回记行不行,甚至有些人说老师我根据他理解,我这样GX这个就不是不是一个紧特别要紧的一个事了啊,但这这样不行啊,这个地方这这样不能这样写啊,这样写要因为你返回的是一个。
24:17
一个类型推断嘛,咱们L的话,你也不能这样去写好,我这直接返回的这个结果根据是从哪呢?是从这来的。好,那么我们就来用一下,看看怎么用啊,来走一个。好用起来呢也很简单,我们直接来把它进行一个传递就可以了,来走一个,呃,我们怎么调呢,Comp。好,这有了传第一个F,这上面已经有了,把F传进去,第二个是我们的G函数,G函数传进去,好传进去过后呢,我接收成了一个H2。哦,我接收到一个H,现在呢,我们来用一下,看看能不能满足这个需求啊,走输出,那么H我先传一个二,按理说这方应该返回一个一,好,我们再来一个H传一个一啊,他说了啊,一和零都是嫩,那么我们把它打出来一下,好把它打出来一下。
25:20
H0好零好零呢,这两个都是嫩。OK,刃和刃,好,我们来玩一把。和我们运行一下,同学们,我们运行一下,好运行起来。我们看这个结果,诶跟我们想的呢,应该是一样的,对吧?诶他这个地方有一个问题,呃,我们看这地方它是走的是哦,我这写错了,因为我这看大家看到没有,这就不满足人家条件了吧,你看为什么刚才我这写的是刚才应该返回的GHGH,因为人家要求的是这个,如果你走的F,它就返回1.4了,就跟他不吻合了啊,所以说这边应该填GHG函数来返回,这个就跟人家匹配上了,走。
26:09
诶,大家理解一下。好,同学们看这样就返回1.0 1.1.0就是一嘛,1.0就是一,好的同学们,那这个题呢,我们就先评讲到这里啊,也很简单,其实这个题的难度就是理解这个题意,语法这块没没什么难,没什么难的啊,这个地方的难点。难点就是要理解他的题意OK,难点就是理解理解这个题意OK。我认为啊,我认为语法同学们都没问题,主要是题意理解一下,好这个高阶函数讲完了过后呢,我们接着再看,再看几个题吧,啊好,这个题也特别简单,但是呢,也是题不好理解,我们先来理解一下它的题是什么,先把这个拿过来。这个提议不好理解。来走一个零五。
27:02
EXERC05,不着急啊,同学们,我们先把这个题理解清楚,再来讲解。怎么写好他的提议呢?是这样子的,来,Lawyer往这看啊。哦,我这儿下滑一线。好,你看他为了让我们理解呢,人家还给了一个案例,这个你要好好理解一下,他说啊,编写一个函数叫values,函数名已经给你了。呃,然后呢,这个values可以干什么呢?它可以接收一个函数,这个函数的类型是呃,传入一个int,返回一个int,好,这个很好理解,那么这边还给了一个漏和一个high,就是它的一个最小值和它的最高值,就是两头其实会形成一个集合,所以从这我们读出这个提议呢,就是这个是呃函给出这个函数形式,给了函数的形式。形式给我们了。
28:00
形式给了OK,那么它可以,它其实也是个高阶函数啊,然后呢,他说这个函数可以干什么呢?它可以输出,输出就是返回的意思,它可以返回一个集合啊,这个集合可以干什么呢?可以对对对应对应给定区间内。就是说。对应给定区间内,按照给定的函数输出。输入和输出,就说你这个最小值和最高值呢,是一个区间,你可以这样理解啊,这个区间就是他说的这个区间。他就说的这个区间指的是什么呢?其实说白了就是这一个no to high。所以他认为这是个区间。以前我们讲过,确实是可以形成一个区间,那么这个区间它返回一个集合,它会返回一个集合,返回一个对偶集合,看清楚了,那么这个对偶集合从哪来呢?从哪来呢?这个对偶集合产生的这个值是根据你的这个,诶这个放函数返回的。
29:14
你看他怎么返回的呀,他说把你这个值传进去,我给你返回,那关键就是这个地方怎么去返回的问题了,对吧?好而且呢,同学们可以看出来,他这个是从低到高按这个顺序啊,这个返回的第一个肯定是负五嘛,所以他应该返回的类似于这样一个,就是通过通过一个函数函数来处理。啊,处理什么呢?处理我们的这个这个这个这个值啊,这个值再返回了,返回了一个这个,呃,一个队偶,这个对偶,这个对偶呢,我们可以看出来,从而看出来应该是第一个值是他的最低值。
30:00
第二个值是它那个处理过后的那个值,而且呢,整个这个地方处理一次返回一个对偶处理一次返回一个对,整个返回完了过后是一个集合啊,这个题有点不好懂。他整个处理完了过后呢,这边是一个集合,就不知道有多少个,最后你看他说负五二十五,负四负六,那这个很好很好理解了,说白了就是便利我们这个你你在这个八六十就是便利这个no to high,然后呢,卖我们这个放函数,这个放函数里面要返回一个对偶,而且你要把它组合起来,难度在这里。难度在这里好了,嗯,这个地方呢,还是直接把这个这个结论给他拿出来看一下就可以了啊,其实特别的简单,我呢这已经写了一个,我就直接拿过来看,很简单一个东西啊。啊,就是返回这个名字,我待会改改一下,不要叫瑞啊,其实也是,只是他是个队友,瑞也是没问题的,我们看一下,那看这是他的形式,这个给人家给给定好的,就是函数的形式已经给定好了,形式已经给好了。
31:10
好,然后呢,大家看我这儿定了一个空的。啊,这定了一个空的1LIST啊,因为他说呃,返回的是一个集合,但我没有说一定是数组,那我这个名字,那从我这看应该不是叔叔,我就把这个名字改一下啊,我不叫这个A了,叫list词吧,6LIST史词叫list。LIST66新的一个list,好,这样呢,更更好理解,这是我的一个空集合,空集合准备准备干什么呢?诶,我要准备放放我们的这个队友,放我们的队友。好,这个list里面放的就是对偶,那个对偶怎么来的呢?大家看,Low to high to high,这个就是进行一个便利啊,进行一个便利,当然要是这样写也是可以的,括起来。
32:02
啊,然后这边low to high for each,这里面其实就是我写的这个要处理的一个函数。啊,要处理,那么这个X从来的遍历出来的,那这个ara其实就是6LIST,好我们看一下最后呢,我们返回的list,我们看一下这个题啊看下这个历史,历史的好这个地方。是不是多了一个这个玩意儿啊,好,我们来看看,这是便利。便利哪个呢?就是low to high,我一个讲啊,Low to high,便利FOR1就是便利,便利的时候呢,里面我们传入了这么一个处理方法,这个X是什么呢?这个X就是你这个low to汉里面便利出来的一个,那X是多少,就是说如果说我这写全了,大家应该能够看出来,就是X就是从这遍历出来的,遍历出来过后呢,我交给了一个函数去处理。哪个函数呢,就是我这写的这个,这传进去的这个函数,那这个函数到时验是写成什么样子的,对根据你的传入是有关系的,然后呢,这进行这个拼接,这进行这个组合拼接。
33:15
好拼接。就是相当于把它这个这个拼接在一起啊,就是拼接在一起加进去,相当于加入加入。好加入加入,那最后呢,返回了这个结果返回。返回这个历程,那么我们来用一下啊用一下,那这个怎么用呢?你看这都已经写好了,关键就是我们要把这个函数写好,人家函数都已经给你了,大家看这个函数是长的这个样子的。就是X乘以X,所以你调的时候呢,你要按这个给它传入一个逆变函数,我们再写啊叫values,我就直接写values,好大家看第一个要写的函数就是传进去这个函数,那传进这个函数呢,我们来写一个值啊,我们来随便写一个吧,比如说X出一个int。
34:09
对,然后呢,这个地方X乘以X好写完写完以后呢,再给它一个负五到五。好,这个就OK了,嗯,这样子可能理解起来有点困难,我重新换一个名字啊,这两个都叫X,大家理解起来特别的困难,我换一下,因为两个都叫X,大家看起来好像很很麻烦,我这样改一下,我改一下大家看能不能看懂啊,Element这个我选择item。这样可能大家理解更更轻松一点。这样子啊,把这个换成这个。把这个换成这个,这样可能理解起来要轻松一点,再看一下啊,同学们再看一下这个item呢,是从这个low to high便利出来的,我写到这。再看一下啊,Item,这样可能看起来轻松一点了。item是从是从哪里呢?是从这个low to high便利出来的,就是便利出来的,是从这个low to high便利出来的。
35:13
好,遍历出来的,那遍历出来过后呢,我返回的结果是把这个便利出来的,第一个先放到这,因为它返回这队友嘛,然后第二个值是从哪来的呢?第二个值是从你传进去,这个放计算得到的,这样可能看起来更轻松一点,那么你便历一次,我就得到一个。得到一个呢,跟它这个相加,加的时候是这样加的,我们来看一下怎么加的啊,我给大家提迭代一下,第一次这个六是空的,原先是空的,看清楚了啊,它为什么返回是这个顺序,你第一次是空,第一次传进来是个什么?大家回答老师是不是负一负博,你算出来过后这个值是不是应该是这样子的,同学们第一次啊,第一次我们看一下第一次是不是6LIST的等于负五,把这个负传进去执行的这个放,这个放是谁就是它。
36:11
这个放就是传进来的这个玩意儿,这个玩意儿又干什么事情呢?他把你的这个item拿到去进行一个计算,就是25,说他第一个得到是25,拼到我们这个空的里边去,你原先是个空的,你你想想你原先第一次的是个空的,你是一个空的这么一个玩意儿,那相当于把这个就扔第一次就相当于把它扔进去了。记住啊,第一次我们就得到这个结果了啊,这样子,第一次这个整理完了过后,我们得到的结果是这样子的,注意听就是负五,我这个稍微大家讲讲细一点,因为我们这个练习的本身不多,大家一定要认真听啊,第一次我们拿到是这个结果,看懂了没有,第二次这个哥们又开始来便利了,那便利的第二次传递这个item是什么呢?就是我们的复试。
37:03
复试好,第二次复试,我们我们把这个这个有点不好写,我我写到下面去啊同学们我写到下面去,不然的话这个展开不了,第二次我们来看看第二次又来了,第二次是怎么样呢?这个仍然是new list等于好第二次你这个item蒙从这从这个地方遍离出来,是个什么玩意呢?是个复式。复试经过,把这个复试传到这个放里面去,它复式乘以复试不就是16了吗?好16它又干什么呢?又跟我们原先的这个历史的进行一个拼接,你你现在是这个这个玩意儿。是他那么这样一组合,是不是我们原先讲过list的组合,是从右这个左边的扔到最前面去,还记得吧,啊这样子呢,他会怎么做呢?这样子他会怎么做,是不是就就把这个flish扔在了哪一块?
38:03
是诶是一个二元组,这是个二元组是吧,是个二元组这个list的是啊,对,他是不是就放进去就完了,放进去就完了,这个很简单,所以它这个地方做了一个运算,这样子就得到了一个新的集合,就是这样一个东西,对。放到后面去了是吧,放到后面去了,所以说他就是直接把它放到这边去,得到了一个这样的东西啊,类似的这样的一个东西,好这样一个东西处理完了过后呢,以此类推,最后不停的往上边走,走走走走后面就得到了一个这样结果,我们来执行一下,好看这个结果啊,同学们走。好,我们看这个结果对不对,我们这个结果呢,一走我们发现诶没有输出,我把这个输出一下print print把这个结果进行一个输出。来看一下。走代码哦,走代码。
39:03
那么这样一输输输出呢,我们可以看到这个结果,是不是这个结果跟我们想的不一样,是不是我刚才讲的这个顺序跟我说的不一样啊,你看我这是五,25,我们原先第一次得到是负五吧,负五是不是应该我们我们这地方为什么给出这个结论是这样子呢?不对啊,不对,要重新来看,我刚才分析到是这了,同学们看啊,我们分析到这儿的。你这个第二次是复试一个16交给它,其实就是把它扔到这里面去,是不是是这样子吧,所以说他应该是这个结果才对,所以他这个结果为什么给的。不对呀,应该是这样子的,你对就看你怎么放,就看你怎么放,对,如果我是这样放的话,它原先是这个,那这个地方就会给他扔到这个位置,是这样子的吧,是这样子的,那这样这个结果最终呢,就会不停的往往往这走嘛,最后就是负负五二十五,那如果说我这个顺序颠倒一下啊,同学们,我把这个顺序颠倒一下。
40:10
这样子。OK,这样子的话,我们来看看这个结果好,这个因为人家的要求是这样一个结果,诶这个不行,这样不行。这样子还不行,那怎么处理呢?同学们改啊,再交换一下是不是就可以交换,交换一下就可以,反正这个地方大家看我再点一下,我们如果在保持不变啊,如果保持不变,我们来re reverse,哎,反正他这个要求嘛,按照要求来招。按照这个要求,只要能达到他一个要求就可以,好,这个也是OK的啊,这个也是OK的,没问题,反正你怎么做,只要能够达到他的需求就可以了啊,就可以了,好可以让座啊可以让座,好这是我们的这个题的评奖,这个题的评奖OK。
41:01
好,我们紧接着呢来看第五一个第三个题,第三个题特别的简单,第三题为什么特别简单呢?我们做过,他说求一个数组里面最大的元素,这个其实说白了就是reduce next,这个我们先讲过,我们简单看一下就可以了,以前写过你看啊,我这我这个就不执行了,大家看我这里写了一个F1,这个F1。这个F1干什么呢?接收两个值。记住两个值,如果L大于R,就返回这个大的值,否则返回最小值,这个在以前就学过,这个我就不说了,这个是求,求出最大值。啊,这个在前面讲过,我就不去评讲了,非常的简单啊。第二个题他说用to和reduce ne实现阶层,不得使用循环和递归,这个也很简单,你看我拿到这个过e to n reduce,这个是怎么来的,看起来有点有点神奇啊,我们给他演示一下这个怎么来的。
42:05
好,这个呢,我们新建一个文件叫做4X4。也很简单,我们来看一个走exer c,好的,那么我们写个零啊,应该是零六了,零六好,同学们看这个东西是怎么来的啊,走。其实这个地方的准确来讲呢,它全写不应该是这样写,这是个简写,他应该这样写才是最标准的写法,大家不要说话,听我这讲啊,最标准的写法应该是这样子的,怎样做的呢?我传进遍历出来,每一个应该是一个n int,比如说我写个X。他标准的写法应该是这样子的。然后我拿到这个值过后呢,我对它进行一个拿到,是不是拿到两个值,它这个拿到两个值,所以说一个是X,一个是Y,好因为你这reduce它是一个二元,它要接受一个二元函数,所以说应该接受两个值,好这两个值做完了以后,它要干什么呢?是不是要进行一个乘啊相乘,相乘是不是就返回去了吗?就X乘以这个Y。
43:21
X乘以这个Y,理论上标准应该是这么去写,但是呢,因为前面这个类型它能够类型推导,而X和Y呢,分别在这边只出现过一次,因此呢,这边就可以直接把这块去掉了,去掉把这个也换成这个下划线就是这么来的。好,我们来执行一下,同学们执行factory,给他传一个三,这个三这个结果应该是等于多少呢?相当于一乘以二乘以三等于六,Very good啊,那我们执行一下。诶,这地方为什么执行不了了,因为要把它改成object。
44:01
对,执行一下,请看六,如果是六说明这个是正确的,没有任何问题,好这个我就不去测试了啊,第五一个题,第五一个题呢,也是这个题意不好理解,我们看一下他什么意思啊。呃,我们先把这个题念一念,他说编写一个函数叫largest。求这个最大的数怎么办呢?大家看它说我接收一个函数。这个函数呢,接收的是一个int,返回的也是一个int,但是我要求哪里面的最大值呢?我要求的是input这个集合里面的最大值,他说了啊,输出在给定输入序列中,给定的函数的最大值,就说相当于说他的意思就是说我要把这个input里面的这个。元素,每一个元素分别传给这个放函数,然后把这个结果统计到,看哪一个是最大值,就是这么一个意思,所以说你看这个提议呢,也非常的简单,我们把它先写到这来。
45:14
来,同学们,我写到这里来啊,我写一个叫exer c07。零七来走一个小案例,这个函数呢,首先我们来读懂它的题意哦,读懂它的题意,OK,我们看一下他的提议是怎么说的啊,他的是怎么说的,嗯,先写一个函数,是个高级函数,它可以接收这个largest largest2。At它是一个高阶函数,这个高阶函数呢,可以接收一个这样的函数,它可以接收。
46:00
诶注意看啊,它可以接收这样一个函数,然后呢,还可以接收到一个序列,还可以接收到一个序列,还可以接收这样一个东西。好,这是它的一个前提。然后呢,他说输出在给定输入的序列中,那么这个给定的输入序列其实就是同学们看到的input。Input就是给定的输入序列,就它中给定的函数的最大值,就说还要把这里面的这个元素呢,一个一个的扔给这个方,进行一个计算,求出它的最大值。怎么理解呢?就是将。注意听啊,将这个input的每个元素的各个元素,各个元素啊元素传递给传递。传递给谁呢?传递给这个放进行计算,OK,计算,然后看哪个是最大值,然后呢,求出这个最大值就是返回吧,返回最大值就这么一个意思,举例,他说比如说我这个传入这个函数是X,这个X呢是它的这个行参。
47:17
其实这个X就是这,那么这个函数体是什么呢?是十乘以X再乘以它,这没写全啊,就说这个同学们看一下,这个就是代表他。这个接收到的这个匿名的函数,然后呢,1TO10就是这个input,他说这个应该返回25。就是这个最大值是25,大家可以算一下最大值是不是25,就是一把一传给这个函数去计算,把二传给这个函数里面最大的那个应该是25。是不是25,应该是25啊,那他的他这样说的应该是25,然后呢,他说不允许使用循环或者递归,就要求使用高级函数来完成,即使用高阶二级,使用这个高阶函数完成,那这个东西。
48:09
你把这个题读懂了,当然就很简单了,其实就是便利我们这个脉部求最大值吗?这个有什么难的呢?特别的简单,来吧,整一个呗,来走一个,咱们走一个啊DF,我们就按他的这个文,这不都已经把这个格式都给你了吗?把这个格式给你了,这没几乎就没什么写的了,主要是读懂题意,各位朋友。OK,那这个返回我们是不是用这个类型推导啊,然后同学们这个是不是就就那个map一下就行了,就这样子是不是可以最简单就是input.map。那么map传进去这个map里面是不是int,理论上说应该是一个这样的值了,N。Int,大家看我一步步写这个n int传给谁,是不是传给他呀?能看懂吗?是不是传给这个家伙,传给这个家伙,我问同学们,我问大家整个这个便利完了过后是个什么结果?哪个同学告诉我整个这个卖完了过后返回的是什么东西?
49:16
返返回的是不是你把这个一传给这个放返回的结果,把二传给他返回结果一个集合呀,是不是最后你要求最大值不是一个max不就完了吗?是不是就就完事了,就完事了。大家看能看懂吗?应该能看懂啊,如果这个看不懂再使劲看,然后呢,因为又是来了,因为你这边这个N,它是又只有一个参数,所以说这边一收起来就变成了这个德行。是就变成这个德行了,变成这个德行,然后你掉的时候你得小心呢,你得你得玩一把啊来,那这个时候我们应该怎么传进去呢?就是我我我先这样子啊O1步来,然后拉的是不是要给他传一个,给他传一个函数,这个函数是不是人家已经给你了呀,这看懂吗?是不是就这样子传进去了,传进去过后再来个一吐十就完事了。
50:15
这个,而且这个函数呢,因为你在传的时候,这个X,呃,这个这个能不能省略啊,同学们,这个X能不能省略啊,是不是也也也可以省略啊,因为它是它是一个in特嘛,所以说你这样子这个还不能省略啊,那这个可以省略,这个是可以省略的,但这边不能省略。诶,这个这个能不能省略了哦,不能因为这个X里面出现了好几次了是吧,这个不要省略了,不要省略,这边出现了好几次了,好最后这个结果呢,我们接收一下这个结果应该按他说的呢,就应该是多少啊是25。我们看是不是二十五八。是25就对了,不是25,那么就咱们就有有错误啊,各位同学明白了,等于我们加上一个max,好,各位同学我们执行一下走着好,我们看看结果跟我们想的一样吗。
51:08
诶好像是一样的,那这个25,他说25,那就是25了,我们就没有错,大家理解一下啊,现在你们能够感觉到,现在这个高阶函数一旦用起来,其实你要用的不熟的话,很难看懂的,就是它的这个编程的方式是把函数当成一等共名,把函数当做一等公民,那么一等公民你就感觉它是什么呢?它好像就是一个变量一样,来回的切换用。所以说这个还是很强大的,好,那关于这个题呢,我们就评讲到这里。好,这个我把我的这个这个答案写过来啊,这他我我写了两个写法,那么我把我的这课堂的再写过来,这个好理解一下,课堂的这个这个写法一样的啊,一样的。我把刚才这个代码呢,给同学们也搬过来,好,同学们认真听啊,因为我们这个练习呢,要多做一点,好,第六个题我就不去讲它了,这个题就是一个,这一步太简单,我就不讲了,再看这个unless,好像我讲过似的,在控制抽象里面,我讲的是一个实现while循环,你看写法都跟我一模一样。
52:19
Conditions block,这个不就是传一个代码块进去吗?你看这个零大于一大于什么玩意儿,就是传了一个代码块,Print就是一个代码块,这个我就不再讲了啊,这个以前如果想不起来,同学们想不起来去看。看我的那个控制抽象,这个我应该是当时讲的比这个复杂多了,讲不起来,讲控制抽象自己去看。好了,这是我们的这个作业的评价,我先截取一段。
我来说两句