本帖最后由 Tracy.Liu 于 2020-12-4 10:24 编辑
干咱这一行,或多或少都听过这么一个名词:递归,
那么递归到底是个什么呢?
简单来说,函数直接或间接调用自己的过程称为递归调用,
那么如何才能掌握递归呢?
其实递归有两个关键点,掌握这两个关键点,也就能掌握递归的冰山一角了,
哈哈哈开个玩笑
言归正传,递归的两个关键点:
1、自己调用自己
我们要解决的一个问题,可以通过函数调用自己的方式来解决,
即可以通过将这个问题分解为子问题,然后子问题可以再分解为更小的子问题,就这样不停的分解。
并且该问题与分解后的问题,解决方法是完全一样的,只是参数不一样。
因为这些问题都是通过某一个函数去解决的,最终我们看到的就是不停得函数调用自己,然后就把问题化解了。
如果这个问题不能分解为子问题,或子问题的解决方法与该问题不一样,那就无法通过递归调用来解决。
2、自己可停止调用自己
停止调用的条件非常关键,就是大问题不停的一层层分解为小问题后,
最终必须有一个条件是来终止这种分解动作的(也就是停止调用自己),
做递归运算一定要有这个终止条件,否则就会陷入无限循环。
以上即为递归的关键点,其实百度/知乎一搜一大把,
在本帖提出来的目的,当然也不只是为了给大家解释名词的,
关键是我们如何用活字格的服务端命令来实现递归算法。
在这里我们首先要搞清楚算法和语言之间的关系:
简单粗暴地理解,算法顾名思义,可以理解为运算的一套方法,所以是套方法论,并不是具体的实现,是解决问题的思路,
为了让该方法落地,我们需要依托一种语言来实现这个方法,使其变得可以拿来使用;
毕竟服务端命令已经具备三大结构:顺序结构,选择结构,循环结构,
从这个角度看,活字格的服务端命令,完全可以看成是门新的语言,是门可视化操作的编程语言,
既然是这样,我们完全有信心用服务端命令来实现递归;
具体该如何实现呢?
接下来,我将借助一个例子,详细介绍实现细节:
例子:有一个节点,下面含有子节点,子节点还有兄弟节点,
该子节点和兄弟节点下面还有孙子节点,展示出来如下图
这时我想删除节点D,当然D之后的子子孙孙也要连带删掉,株连九族,是个狠人儿
分析:我们把删除节点D看做一个大问题,删除D下面的节点E和节点O看做子问题,删除节点E下面的节点F看做孙子问题,
以此类推,最后总归是会删到末代皇帝的,与递归思想如此贴合,这么看完全就可以使用递归算法来实现
接下来就等上干货了,
等等,在上干货之前,我们还需搞明白一件事儿,服务端命令如何实现自己调用自己,
在活字格中,服务端命令A调用服务端命令B时,首先得先创建B,这样才能被A调用,
可是自己调用自己,我还没有创建好自己,那该怎么调自己呢,
巧妇难为无米之炊啊,实在是难为我胖虎
转念一想,唉~!我可以先创建个不完全的自己,这样这个命令就存在了,我自然也就可以自己调用自己了。
有了这个想法,那么一切都顺理成章了
再结合这个demo,食用效果更佳哦
递归删除.fgcc
(375.35 KB, 下载次数: 474)
|