00:00
好了,同学们大家好,那么我们将在本小节当中为大家介绍函数中一一种比较特殊的函数,叫做递归函数。当然学习递归函数对于初期来说有一定的困难哈,但是大家不要害怕,递归函数这个东西需要一定的时间来理解,来给大家写一下递归函数的文档啊,好,创建一个文件,那递归函数首先对于递归函数的概念做一个解释,递归函数的定义非常简单,就是在当前函数当中调用当前函数,当前函数啊,函数本身的函数就是递归函数,哎,就有点自己让自己干活这种意思啊,就递归函数的定义非常简单,甚至它的使用也非常简单,只不过理解的时候需要大家有一定的什么呀,长期思索或者叫长效思索的一个范围,也就是说你思考的时候不能断开你的思路啊,好了,在这里边,呃,我们新建一个文件。
01:01
好,我们是应该到第15个文件了啊,MY线扣的四向角线15啊,大家也不用害怕啊,说递归函数,递归函数对于初始有一定难度,但是大家什么呀,随着时间的推移会什么呀,会慢慢的理解的,因为递归函数就需要一个领悟的过程,也就是说需要你一定的基础知识的积累才能够达到领悟的状态啊,来递归函数。递归函数。递归函数递归函数常用的教学例案例非常的简单,我相信大家其实也能看得明白,但是运行过程当中你就可能会出现一定的问题或者误差。好了,我们定义一个函数DF函数就叫递归,没什么好说的,然后呢,看好了,我们这个函数呢,一共分为三步,首先函数有一个参数啊,需要传一个数值进去,里边一共三步,第一步叫做打印变量啊。打印变量。A变量。好,没问题,这个大家还有不会的吗?Print,它上括号,然后呢,我们的am就可以,这是它的第一步,第二步函数是什么东西呢?叫做检测变量是否大于零啊,检测我们的A是否大于零,根据这个来做不同的操作F啊,如果我们的AUM。
02:17
大于零,我们就做什么操作呢?将啊N减一,将nu减一啊传递给函数,给啊函数。也就说白了,给什么呢?给函数,也就是说我在这里边再调用递归函数本身,然后把number减一减一放进去啊,OK,然后接下来看,如果它是小于零,那怎么办呢?那简单,如果它是小于零的话,我们就直接输出一行横线就可以了,好不好,来来,那小于零的话就是输出一行横线啊。输出一行横线,输出一行横线非常简单,然后在里边print横线一行来引号横线,横向横向横线。
03:06
然后这是第二步,完成了第三步干什么事呢?再次打印number变量,看好了叫再次打印nu变量。这就是我们递归函数学习当中常用的一个什么格式,大家好像说这个函数好像不难当,是不是本身函数看起来没什么东西的,但是运行的时候呢,就比较麻烦,因为大家发现了没有在函数的内部。调用了函数本身。调用了函数本身,那这里边儿就产生了一个漩涡,或者叫一个层层层叠的一个效果啊,那么说明这个函数该怎么运行呢?好在运行函数之前给大家强调几个知识点,第一个局部变量。局部变量啊,什么叫局变量呢?是不是仅在当前函数中有效啊,所以需要注意局部变量这块需要注意什么东西呢?每次调用的变量啊,都对当前调用有效,也就说比如说这个递个函数我调用了十次,那这十次函数中的number分别属于十个不同的变量,他们直接互不影响,因为函数这个变量是不能出当前函数调用本身的,你不给出当前函数,你自己调用十次,这十次也是互不相同的,明白,所以这个要理解一下啊,然后第二个问题是不是我们的函数中number是否有过变化变化。
04:35
就是不论怎么地,你看这里边经过这个操作,Number有没有发生过修改本身值的操作,大家会发现没有,比如说number每次都是什么呀,进来和就是第一次啊,第一次和第三次。的输出一致,因为大家会发现吗?第一次输出和第三次输出,呃,第三次输出没写啊,主任在那本第一次输出和第三次输出之间没有number的任何重新赋值的操作是不是,那number进来了,是不是我传,比如说我传个九吧,那打一个九,你下面再怎么判断,你再怎么解,一传进去number本身没变对不对,所以打印的结果还是个九啊,就这个例子好,有了这些理论作为基础之后,我们来看一下函数真正执行的结果,我可以直接告诉你结果是什么样子的结果,看你调用谁了,比如说我调用的是调用,叫调用函数啊,我们写一个递归三吧,行不行递归三。
05:35
我告诉你,第一学过递归函数,或者理解递归函数,一看就知道答案是多少,是33210,然后呢,横线横线横线0123,这是它的结果,运行结果啊,运行结果,他说这个结果怎么学过递归一下就能明白呢?好,下面我带着大家注意看了,一步一步的执行,明白了吗?一步一步的执行也是我们自己来分析这个递归函数执行的结果,好了,由于我们在这边调用递归三,那咱就直接来运行递归三函数行不行,把这个函数整体复制下来。
06:10
好,你不是要递归三吗?行,没关系,传递一个三进去吧,对不对,好,那我们在这里边啊,是不是应该输出个三。对不对,所以第一次打印的结果是个三,我们把三放在最后啊,打印了一个三,OK,接着来看,那三是大于零的呢,大家会发现哦,三是大于零的,也就是说条件是不为针呢,是不是为针,最终运算结果是不是为针啊注意这是分析啊,这叫为代码,是分析的为针,那为针的情况下,它是不是执行F区间,而不会执行F区间,所以我们可以把它删掉,是不是一定执行F区间,好,那也就是说这里边会什么呀?执行一个函数叫递归三减一,那递归三减一的本质是谁?那三减一不就是二吗?所以在这里边调用了递归二函数,调用递归二函数啊,递归二函数函数。好了,那我想问一句,这个能打印吗?
07:02
能执行第三步吗?不能,因为按照顺序结构,你必须把上面第二步执行完了,才能执行第三步吧,是不是,所以这一步它什么呢?必须等待,必须等待第二步完成。第二步完成,那我们这第二步里边干了什么事啊?第二步里边干了什么事情呢?在第二步是不是将于递归二函数啊,你得把这个函数第二步执行完了才能够执行它对不对?而且如果要输出number的话,Number是几进来几出来几位是不是?所以它应该输出三啊,应该输出的是三,但是它必须等待是吧?这一步完成,所以把这一步啊,必须等待这一步完成啊,这个函数完成好,然后接着来呗,那你既然我需要等待,那就先把递归二执行呗,好,递归二是不是又调用递归函数本身了,于是乎我把递归函数再次复制一下啊,因为每次调用都是单独的嘛,是不是,然后OK,那在这里边什么呢?调用了一归二函数,是不是传了一个二进来吧?
08:00
好,也就是这块调用地块是不是传了个进来,好传了个二进来之后,我啥都不用想,先打一个对吧?所以我们在里面得到了一个二是不是,那在这接着分析二大于零吧,大家会发现二大于零为针,是不是为针的话,这个L区间是不是不会执行,好我们删掉它,那这里边就会执行递归二减一,也就是相当于执行了什么呀,递归。递归啊,相当于调用递归函数二减一,那递归二减一不就是递归一吗?是不是不就是递归一吗?好,也就是说哦,我把这一步执行完了,就是调用递归一是不是?那调用完递归一就不可以输出什么呀?输出这个number了吧,是不是,但是递归一它还没调用呢,所以它输出的值我们可以确定啊,它输出的肯定是二啊,应该输出二啊,应该输出二,原因就是因为它进来是几,第一步和第三步一定一样嘛,是不是应该输出二,但是呢,必须等待,是不是等待上面这个数学结构执行完毕啊,所以必须等待我们的递归一完成才行。
09:02
完成才行,所以现在又有等待了,是不是得,那你要执行递归一,我就再找递归的函数呗,于说么,把递归函数再次复制一份拿下来,好,这里边你不是要调用递归一吗?行,没有问题,我调用递归一行吧,是在调用递归一吧,你可以写上去递归一调用啊来。调用递归一,你要愿意写就写,不写也没关系啊,调用递归好一行,这上面直行了,那递归一进来是不是先输出个一,啥都不用写,我们得到一个一对不对,然后一大于零吗?大家会发现哦,一也是大于零的,于是乎它也执行真区间,那L区间跟咱们一块关写了是不是?那就要执行真区间里边的递归一减一,那递归一减一的话是几啊?那是不是就相当于调用递归零啊,相当于调用递归零呗,调用递归它括零啊,归零写上去啊,现在一定要用递归零,那我们这一步完成之前,第三步是不是也不能输出啊,但是我们可以先分析一下,由于进类的是一,所以这块它的输出啊,应该输出一,是不是应该输出一,但是它现在不能输出,因为什么呀,要等待我们的A归零执行完毕。
10:10
递归零啊,要等到我们的递归零完成才行,好,没关系,你不需要递归调用递归零吗?行,咱这里边调用递归零呗,调用啊地归零。行,那就把递归函数再复制一次过来对不对,往这一粘贴好,那这用递归零是不是先传个零进来,好,那也就说我们这里边得到了一个零,然后呢,零大于零吗?这个零输出了,那零大于零吗?显然不大于,也就是说这块终于得到false值了吧,是不是false值了,那不大于零真区间是不是就没用了,我们执行假区间,诶顺序结构是不是执行它了啊,分值结构选择执行假区间,于是输出这一行横线,好,输出完横线之后,我们D归零的第二步是完成了,该输出第三步了吧?好,第三步输出几啊进来几出来几倍是不是?所以这块又输出了个零,好,那这个时候我们递归零卡数是不是就正法了?那递归零卡数谁调用的,是不是上一步在我们的上一步的第二个位置这块调用的,所以我们递归零完成了,就相当于上一个递归一函数中的第二步完成了,于是这步完成了,可以顺序结构就往下,这就行啊输出几啊输出一,因为它完成了零嘛,是不是,所以应该输出一,我们这边就得到了一个一,好,那这一来看的话。
11:23
递归一函数是不是所有代码也执行完毕了?好,递归一是谁调用的呢?是上面这一步递归二函数的第二步调用的递归一吧,于是我们执行完这一步,是不是可以把递二步递归二中的这最后一步给执行了,是不是应该是二,是不是,所以我们下面得到了一个二好了,那这个时候呢,我们的递归二函数也执行完了,执行完递归二之后呢?谁调用递归二是不是在递归三的第二步调用的递归二函数,所以递归二执行完成的时候,相当于第三,递归三的第二步完成了,是不是可以输出它在第三步了,哎,输出一个三,所以我们这里边又得到了一个三,这样一来的话,递归函数整体就完成了,所以这就是递归函数运行过程是不是相对来说比较复杂啊,因为对于很多初学者来说,大家没有这种什么呀,呃,暂停的思维,所以导致大家学递归会有一定的困难啊。当然递归函数为什么叫递归函数呢?从你的运算过程大家有没有发现一个端倪,它是从上面一步一步运行到底部,是不是到底部摩擦运行之后再一步一步都。
12:23
返回了上面,递下去,归上来,所以这叫做递归函数,能理解吗?递下去归上来,这就是递归函数好了,那么递归函数在日常生活中的作用还是比较明显的啊,还是比较多的啊,递归函数给大家举个例子吧,行不行好?递归函数什么样的操作是递归函数呢?比如说在计算机中最最常用的叫做计算文件夹的大小啊,文件夹的大小很多,这怎么还能到递归函数呢?原因很简单,对于我们的计算机而言,什么呢?文件本身是具有大小的,但是可惜文件夹没有大小,明白吗?你看文件夹大小是不是都是空的?但今天打开之后,你发现里边如果是文件,拉到最后是文件是不是就有大小?也就是说计算机只能知道某一个文件的大小,而没法知道文件夹的大小。那要想获取文件夹大小怎么办呢?右键。
13:19
属性,你就会发现我们这大小看到没有,它在算呢,他为什么不直接告诉我还在算呢?很简单,因为系统正在什么呢?使用递归函数的算法,打开文件夹中的每一个文件,是文件我就统计一下大小,是文件夹中就打开再统计,是文件夹中就打开再统计,直到最底层,然后把算出的结果最后一层层的总结起来,就得到了最终的预算大小。所以在我们的系统当中,统计文件夹就是递归函数啊,就是递归函数。好,那我们在现实生活中做事的时候,有没有递归函数呢?也有这种例子啊,也有这种例子,给大家举一个现实的例子,让大家更好理解好不好?来点开画图板,给大家画一张图。
14:06
啊,给大家画张图好吧,让大家更好的理解递归函数啊,附近画图工具。好了,我们下面讲一个操作,什么操作呢?我要上网吧玩游戏行不行,好,所以我现在看好了,我现在有这么几个函数,有有这么给他操作啊,到网吧玩游戏啊。我想。去网吧玩游戏。去网吧玩游戏。然后那很简单,我这个函数开始就想去玩游戏,然后我如果结束了,那是不是就说明是什么,我是不是到网吧正在玩游戏,或者玩到了游戏啊,是不是啊,在网吧中玩到了游戏,但是我去网吧就一定能玩游戏吗?不是,我可能什么呢?没有带什么呀,没有带钱,所以我要判断我是否有钱。
15:01
啊。我要判断一下是否有钱。这里边啊叫做是否有钱,那结果我发现什么呢?我没带钱啊,所以我得干什么事呢,所以我得找钱。是不是有人说这个功能是找钱功能,那我最终完成这个功能的目标非常简单,就是找到了钱呗,是不是找到了钱?好,那就是找到了钱啊。找到了钱是不是,那找到了钱我是不是就可以什么呀,在网吧玩游戏了是不是啊,这样看起来是简单,但是我真的能找到钱吗?没发我发现我什么呀,没带银行卡,所以呢,我要看一下自己有没有带什么呀,有没有带卡。啊,有没有带卡,有没有带银行卡是不是。然后我在里边看一下是否带银行卡,或者是说是叫做是否带银行卡,那在这里边啊,我就得拿卡呗,是不是OK拿卡,然后呢,这块是取钱啊,或者拿到了卡,这个是找卡,这个是找到了卡,找到卡好,然后呢,这个时候大家再来看一下。
16:19
我们这个操作过程好不好就比较溜了啊,大家看,首先呢,我现在去网吧玩游戏啊,正常情况下我应该玩到游戏是不是,但是我发现我们没有带钱,于是我去找钱,我找如果找到钱我当然可以上网,但是我发现我没带卡,没法取是不是,于是我就找卡,结果干什么事呢?我在我的兜里找到了卡,看到没有,找到了银行卡,然后我就拿银行卡取到了钱,玩到什么呀,在网吧中玩到了游戏,大家看整个什么呀,逻辑的执行过程,是不是去玩游戏发现没钱,我找钱是不是,然后找到了钱,这不是找钱,找钱我发现我没带卡,于是我去找卡,是不是也要在这里边一层刷走,然后发现我找到了卡之后,哎,我找到了卡是不是,在这步是不是找到了卡了?好,我找到了卡之后干什么事呢?我找到了卡就可以取到钱。
17:14
取到钱就可以在网吧玩到游戏,那这个现实中的逻辑其实也是递归函数,大家发现了没有,它的真过程是不是先下去再上来啊,是不是先下去再上来,这就是递归函数的执行原理,而且大家也发现了,这递归函数里边的第一步和第三步是不是同一个级别了啊,都一样的嘛,是不是?嗯,中间加了一步判断啊,这就是递归函数的一些知识点和现实应用。好了,递归函数进讲到料里边,我们在后期会什么呢?随着知识学习的越来越多,会对递归函数了解的越来越深刻。好了,本小节内容到此结束,我们下一小节继续为大家讲解什么呢?拉姆达表达式相关的内容。
我来说两句