00:00
好,同学们,为了加深大家对递归调用的理解呢,我们现在来做两个递归课程练习题来看题。第一个。斐波那系数,这是一个经典的递归课程练习题。这是一个非常经典的递归练习,他说,请你使用递归的方式求出斐波纳气的数是多少?比如说第一个数是菲波拉契是什么?我简单解释一下啊,第一个数是一,第二个数也是一,第三个数开始呢,是前面两个数的和,再说一遍,第一个数是一,第二个数也是一,这是固定好的,第三个数开始呢,是第一个数和它前面的两个数的和。比如说第三个数就是第一个数加第二个数。第四个数呢?是它前两个数的和。是一加二,第五一个数也是前面两个数的和,第六个数也是前面两个数的和,好依此类推。好,给你一个整数,求出它的值是多少,或者说求出它的斐波那契数。
01:06
给你一个整数N,求出它的。斐波纳气数是多少?来,我们一起做一做。好老规矩,我把这个题呢,先给同学们拿到笔记里面来。对吧,大家先思考思考。递归的课堂练习题。递归的课堂练习题,这是我们来一个标题三。好题,整理一下这个思路啊,同学们,你们也自己先想一想。那同学们,我们一起来完成,我呢先给大家说一下这个思路。就是我来谈谈一谈我的思路啊,我的思路这样子的,就咱们做任何一样东西呢,首先你得有个思路,我们思路这样子啊,就说。就是我编写一个函数。当这个N等于一的时候呢,就返回一,当这个数等于二的时候,也返回一,其他就是一次类推,比如说第一个。
02:02
当。当恩。当N等于一。或者N等于二,所以这个应该是等号,不能写成这个复值语句了,对吧?当这个条件满足时,就是返回什么呢?返回一,为什么呢?因为刚才我们讲过,就是N等于一和N等于二的时候,它这个斐波拉奇数就是一。没问题吧,那第二个呢,就是当N。当恩。大于。当N大于等于二时,或者大于一时吧,因为按整数来说是吧,大于大于等于二吧,这样写大于等于二,这样更明确,就返回什么呢?就返回前面,就返回什么呢?前面两个数。前面两个数的和,那说白了就是有点类似于这样子的感受啊,就是N,就是FN减一。加上F。
03:01
N减二能理解我的意思吗?假设这个F呢,就是这个函数。能理解好这个思路已经完了,那么下面呢,同学们,我们来走一下代码。来跟上老师思路吧。跟上老师的思路,我们把代码走一下,一目而了然,一目而了然,非常简单。来,我们写一个练习好不好?在这里面我们写上exercise。Eeee。R2。Exercise就这样一个练习。那么我们给它标一个零一吧,姑且标成零一。EXER。好,这个单词是不是写错了啊,看看啊,重新再整理一下。好,我们把这个单词重新整理一下,这个单词写写的有点问题,Ex exercise啊exercise,好,重新来写一下名字。
04:12
好在里面写上我们的名字啊,我们第一个练习。就叫面点购吧,这个无所谓。慢点,Go。好,前面的这个程序,前面这一部分呢,都是一样的,所以说我复制粘贴一下。把它放到这来对吧,再写一个主函数,每。那么我们这边的要求,刚才老师呢,已经做了一个分析,就这句话求出斐波那契数。我写一个函数来说一下它怎么走。刚才的思路我们已经有了,对不对?刚才思路我们也有了,现在呢直接写代码,说我写个方式。
05:03
斐波纳啊,斐波纳器。就这样简简写一下,当然我有一个整数n in,那么怎么实现这段非波拉契的用递归来实现的呢?非常简单,如果刚才我们已经分析好了,如果N等于。一或者N等于几等于二,在这个情况满足的时候,就返回1S,就是不是这样一个情况呢?啊,不是这样一个情况,比如说它是大于零,当然我们这要求啊,我们肯定是要要求N是大于一的一个整数,大于等于一这个整数,那else情况我们就return什么呢?斐波那里面的N。减去一个一。就是它前面这个数。前面这个数再加上斐波那。对吧,然后呢,就是N减去一个二,这不就是刚才分析的效果吗?写完了,那我们试用一下,测试一下。
06:05
测试。测试的时候呢,我们来找一个,找几个比较简单的啊,来试一下。Print。那么我们来看这几个值吧,比如说我调用一下斐波那。GD1和二这个我就不测了,我直接来测三看效果。我们来执行一下CD点点。Di,然后呢,我们进入到exercise里面去,我们go run,刚才写的面点go,好像代码有点小问题,看是哪里写错了。哦,这边他这样直接输出,他也不让输出是吧,这样子吧。咱们把这个值给它返回一下。返回一下,我们直接来定一个值吧,就是绕。等于。
07:00
这样子写到这儿来就行。剪切一下放这,然后呢,把这个res输出。对吧,等于多少呢RS。好,这段代码,但是这地方我们是不是还应该有个返回语句,是不是应该还有一个int啊。对吧,返回一个印子来测试一下,同学们跑起来。Run go run,然后呢,面点go,这个时候应该返回几呢?返回二。对的,好,我们再来测试一个数。比如说这把我就直接调用。斐波,那然后呢,我写个四,这个四还记得是多少吧,四应该是三对不对,好,我每个都测一下啊。这个地方来一个五,那这个地方应该输出几呢?我们知道第四一个斐波拉奇数,其实三。第五一个斐波纳气数其实是挤压是五,对不对,是五,我们再测一个,这样就证明我们这个是计算正确的,那第六一个,第六一个应该是八。
08:11
好的,同学们,我们跑一下执行。看结果。2358没错,2358完全正确,好,那通过这个练习呢,我们就把贝波拉奇数用递归的方式完成了,我把代码给他写过来。非常的简单。好,这是我们的第一个练习。这个练习的代码我们就拷贝到这里来。那紧接着呢,我们来做第二个练习,为了加深一下,我们来做第二个练习,第二个练习呢,就是我们的题二看要求,题二求函数的值,它说了已知F1等于三,这个呢是我们小学,我们学初中的时候,老师讲过这是一个函数式。对吧,当传入一个一的时候,就等于三,当传入一个N,当然这个N这个里面这个N呢,肯定是大于大于一的,对不对?好,这个就返回二乘以FN减一加一,让你用递归的思想编程求出FN的值,其实这个非常简单,因为它连这个算式都已经给你了,这还有什么可说的,直接写代码就完了。
09:19
对吧,因为人家几乎就把这个答案告诉你了,你地你把它组组,你把它翻译成递归调用的这个代码就OK了。没难度,这个几乎没难度,来吧,我们走一个。嗯,这个我就不分析了,因为他已经把这个算式给我们了,对吧?其实我们做递归调用时,最重要的就是要拿到这个函数的一个表达式。他现在已经把这个表达式给你了,那直接用就完了吗?好,我就思想思路是。思路直接使用提出题给的表达式完成即可。直接。直接使用给出的。
10:00
给出。给出的表达式表达式即可完成案例。对不对,好,那么我们同样走一下代码。那代码呢,根据老师的思路来完成。来吧,打开这个,诶,我把这个电调出来干啥来。还是打开我们这个地方,打开我们我们的Vs code,那我新建一个。这个目录。新建一个文件夹,Exercise。X1。RC,零,二。好,同样我呢,给他来一个。命顶。对吧,好这一块前面这一部分代码呢,我们可以用一下。拉到这里来,同样我们写一个主函数。调起来,好,根据刚才老师的这个要求,我把这个题的需求拿到这里来。没问题吧?约以后呢,便于大家的复习。
11:03
好的放这了,那嗯,这个非常简单,我们写吧,直接写了fun f就用F名字吧。然后这有个n int。然后呢,怎么做呢?如果是不是判断如果N它是等于一的。怎么写?如果N等于一,就一个三,因为他说了嘛,一就等于三嘛。这个应该没没问题,那如果不是的话呢,就是else死了。对不对?如果它不等于一,那就直接执行这种方式,这种方式也很简单,把这个算式拿过来为我所用。这里面不就有个递归调用了吗?对吧?二乘以FN减一。N减一,我把它格式化一下,代码写完,当然这里面也应该有return,既然有return,是不是这方有一个返回值的列表,因为它只有一个值,因此我们这直接写个int完活来,同学们我们来调用一下。
12:05
测试一下。来吧,我直接输出。来试一下。F1。等于。F1等于多少呢?来直接掉下,这个很简单,其实一就等于三,它就会给你返回。那么我在做第二个。第二个测试,如果我给它来一个五,看它等于多少。好的。来,同学们,我们把它保存一下,直接运行CD点点上一级穴。对吧,然后go让我们写的面点go跑起来。看效果,F1应该等于三,F5等于63,同学们可以去试一下,一定是正确的,因为我们是完全按照题的要求来完成的,所以说它不会有问题。同学们看一下,通过这两个练习题,是不是对我们的递归调用有一个新的认识了?
13:05
那后边呢,我们在用到递归的时候呢,还会给大家讲,比如说我们在用到二分查找的时候,就是用二分查的时候,我们会用到这个知识点。用到这个递归的知识点,那个时候我们再再来做的时候,你会觉得非常的轻松啊,非常轻松,好,我把这一段代码呢,也给同学们拿到笔记里面来。加深一个印象。好吧,这是老师写的代码。然后呢,我把它放在我们的笔记里面去整理好。注意看这是怎么来的啊,一步一步分析到位过来的。好,同学们,那么关于这一个函数的递归调用呢,我们的练习就到这儿,下面呢,就是还有一个题,还有一个题呢,难度也还是。还可以,不是很难,但是这个题呢,我想同学们啊,你们自己先想一想老师呢再讲好不好,这个题呢,同学们先想一想老师再讲。
14:06
好,这块前面两个题的视频,我们先给大家截取一下,这个猴子吃桃子,你们先看一看,老师在下一个视频讲。好,关于这个练习第一部分练习题,我们就先给同学们介绍到这里。
我来说两句