00:01
数据库的数据。我们现在已。啊,可是呢,我们这么写啊,不具备通用性什么意思,就是意味这样,我如果现在我们数据库当中的用户维护,他如果还有子菜单怎么办,如果他的子菜单还有子菜单那怎么办?那这样的话你的程序就麻烦了,你得一层一层往下写,而且只要增加子菜单,你还得再写一遍,这样的话就不具备通用性了啊但是。我们虽然说不具备通用性,可是我们发现它有规律,为什么?因为我们都是先找到它的负节点,再找到它的子节点,再组合它们的关系,我们里面也是找到它的负节点,再找到它的子节点,然后再组合它们的关系,那所以啊,只要把规律找到了,而且他们数据之间它有关系,所以我们可以采用一种特殊的算法来实现这个功能,没有必要再一层一层往下写了,那么这个算法就叫递归算法。
01:11
规律相同,自己调自己,就形成了一种递归。所以啊,我们接下来准备把我们的程序我们改善一下,因为我们发现它确实是有规律的啊,不管你有多少层,你都是先找父节点,再找子节点,再组合他们的关系啊,可是那么我们的递归是自己调自己,那么逻辑必须相同,那么我们的逻辑相同吗?我们说还有点差别,有什么差别呢?大家看你的这个逻辑跟这个逻辑是相同的,但是你的这个逻辑好像并不相同啊,因为你这是两个不同的方法,那么你查询的结果是不一样的。那么所以在这种情况下,那我们逻辑都有变化,那么你用递归可能不合适,那好我先把两个方法做个对比,看看他们到底有什么不同。
02:02
那么好,我们来看看,其实啊,他们两个在数据库里面大家看。我们找一下,在我们的道里面,你会发现其实两个的S口纹还是非常像的,那么非常像,那么为什么不用同一个方法来实现呢?那是因为我们的顶级节点非常特殊,它的值为nor,可是这个now呢,我们不能用等号,只能用我们的意思。那所以在这种情况下,那他就只能这么写了,诶那我能不能想个办法让他不是,那但是呢,他跟我们这个又一样,那不就行了吗?可是你不是,那那你怎么体现出你是一个顶级节点呢。别的节点它都有ID值,那你这个值是多少呢?我们说它能是零吗?大家想一想,如果写个零行不行,你如果写个零的话,那么首先咱们的ID里面有零吗?是不是也表示你的负节点不存在呢?那么如果它也不存在的情况下,那是不是我们的它就是顶级节点呢?所以在这种情况我们就发现了,如果他要是零的话,那其实根本就不需要这个,我们只需要把这个PID传个零过来就行了,那所以啊,如果你把这个值变成零,那它的逻辑就相同了啊好,那么我们就把它按照零的方式来处理了。
03:29
那接下来我们这个思路已经有了,那我现在呀,就把这个给它注掉了啊,咱们给它注掉了,做掉了以后,现在我要做的事情是什么呢?我要做的事情就是写一个递归的算法,所以呢,我们写上咱们叫public,然后我们叫void啊,咱别叫public了,叫吧,嗯,是有的,然后在这里我们的,然后我写上叫查询child啊promiss,诶我们加个S,那你查谁的子节点啊,那么我们这写上叫permiss,写上一个叫parent,就意味着你把parent给我查出来,我要查询你的子节点,那么你的子节点怎么查呀,我们之前不写过吗?这个不就是查询子节点嘛,所以拷贝,所以啊,我们的父节点有了,我们的子节点也有了,那接下来我们该组合他们的关系了啊,这个应该改成叫parent啊。
04:30
好,那接下来我们要组合他们的关系,就叫parent点,我们叫side children,把它给它放进去啊,好了,那你这么写完了以后,可是你的子节点,万一它还有子节点呢,所以我们写个循环,然后我们叫permision,我们叫permis冒号,嗯,我们写上叫child permis好了,那我说了,你当前的节点如果也有直接点怎么办?那你同样要去查去,那你查的时候不就查它的子节点吗?这儿不就是查子节点嘛,所以说把这个方法我们放到这里,然后呢,把这个permission我们放过来就可以了啊。
05:16
好了,那这样的话,大家看一看,是不是自己吊自己啊,自己的里面掉自己,这样的话就形成了特定的算法叫递归呀,所以递归啊,查询我们的许可信息啊,把它查出来,那首先我们递归要满足一些条件,什么条件呢?叫方法自己到自己。方法自己调用自己啊,就是自己的方法里面在调自己啊,就这个意思,那么第二个是什么呢?第二个我们的方法它一定要存在跳出的逻辑啊,跳出的逻辑就是说你不能啊,就是不能这个地柜一直递归下去,这不行啊,否则出现个死循环,就会出现战一出了啊,那这样的话就不是很合适了,诶那我们这儿有没有跳出逻辑呢?有的同学肯定说老师你这没有。
06:12
因为我们同学们可能认为啊,跳出逻辑就是什么啊,或者抛出异常呢,这要跳出,但是告诉你我们这儿也有跳出逻辑,什么意思啊,如果这个子节点集合没有为空的话。那是不是就进不去呀。那你进不去,那不就等同于跳出了吗?所以我们这里也是有跳出逻辑的啊,虽然没那么明显,但它确实也是有的啊好,那么然后呢,我们的第三个是什么呢?就是我们方法调用时啊方法调用时。我们的参数之间,它应该有规律啊,有规律这又是什么例子呢?举个例子,我现在让让你。
07:02
一加三加五加七加九啊,点点点点加到21,我让你把这些数用递归的算法算出来,同学们,你们能不能算出来。能吧,那不就是两两求和吗?但是这个两两求和我相信它有规律对吗?为什么它是所有的奇数对吗?可是我现在要求你,你把这几个数来,你给我把它两两求和,你能用递归的算法算出来吗?同学们,我相信它不能,为什么?因为它也是两两求和,但是它每个数据之间有规律吗?没有,没有的话也用不了递归啊,所以我们这个要有规律,那我们这儿parent,我们这里的它不就是child里面的吗?所以它是父,它是指他们形成了父子关系,那这就是它的规律,所以啊,我们这么写是没有问题的,那好,你如果没有问题的话,那我要把它拷贝到我们上面来了。
08:07
你拷贝到上面来以后,那我就要用递归的方式来查询数据了,所以来写上咱们叫递归查询数据,那你递归查数据的话,你要把一个parent查出来啊,而且这个parent它应该查的是它的负菜单呢,也就是说应该是系统菜单的那个负菜单,但这个负菜单并不存在呀,但是零你不传那不行,所以说大家看我应该这么写,看你们能不能明白,咱们叫promis,然后呢,我们就写上叫做等于new permis,然后我们写上叫点ID等于零,你不是不存在吗?诶这个零我就给你模拟出来,模拟出来以后把这个parent给它放到这里,那就行了,你放到这里以后,就等同于我根据零把它的顶级节点就找出来了,那你根据零把顶级节点找出来。
09:07
团的顶基节点在哪呢?那不就在它的子集合当中吗?所以它的子集合是我需要向页面中返回的呀,所以来我的permission是我们点啊,来或者我看看啊,嗯。咱们这里它因为它返回的本身就是个集合,那这样吧,把这个给它注掉吧,那注掉以后我就这么写吧,叫parent,点我们叫get children就行了,因为你这本身就是个集合,而我返回的恰恰是个集合,那不就行了吗?啊,而且呀,我们希望呢,我们把这个菜单显示出来的时候,都是open的,都是打开的,所以我可以把咱们的permission,它里面的这个属性变成true啊,咱们来试一试,好,那我现在呢,把这个呢,我们就给它停了啊,服务器停了,然后重新启动,观察一下我们用递归的方式能不能把数据给他查询出来啊。
10:07
好,现在已经可以了,我们刷新一下,刷新以后你观察一下啊,好像是没有出来呀,那么是不是我们发生了什么错误呢?我们看一看,好像是没有错误,那没有错误的话,我看看我们这个地方啊,然后呢,我们这里啊,我们看一看啊,咱们是什么环节出现了问题。咱们是parent get ID啊,那么这边是它应该是根据零来查,那么他就找到了。然后parent are。看看啊,咱们这边好像是没有返回东西啊,我检查一下啊,来咱们刷新,刷新以后看一看啊,我们点点完以后network啊,我们点一下。哦,他没有返回任何的内容,说明他没有得到任何的结果呀,他没有得到结果的话,那说明我们根据零来查这边是没有查到的啊,所以呢,我们来看看我们这是不是写错了啊,我点一下呃,在我们的这个道里面我看一看。
11:10
咱们这个地方select星啊,应该是这个位置PID。我想想啊,咱们这给个零啊,来给个零,嗯,然后这边啊,来放到这边。嗯,我看看发生了什么事啊parent,然后我们这边get ID啊,然后呢,我们这边child的应该没有问题啊,这是零啊,那我根据零来进行操作,那这个零应该是对的啊好,我们再来试一试,咱们刷新一下。诶,没问题啊,可能是刚才数据出现什么一些操作了啊,也就是说我们现在呢,我们刷新之后,那么我们的数据是能够出来的啊,而且我们采用了一种递归的方法之后呢,我们如果数据它增加了新的菜单,形成了父子关系的话,我们代码是一点都不用改的,来我们试一试,比方说我们在这里写上增加。
12:06
咱们叫增加用户,然后呢,我再来写个修改用户。那么这样的话,增加用户和修改用户,它都是用户维护当中的功能啊,写个四好,然后给他提交我们刷新,刷新以后,诶增加没有问题,那我来刷新也试试刷新你会发现我们这儿也是对的。啊,所以递归算法还是非常不错的,逻辑非常的清晰,代码非常的简洁啊。
我来说两句