PHP使用递归算法查找子集获取无限极分类等实操

递归函数是我们常用到的一类函数,最基本的特点是在函数或子过程的内部,直接或者间接地调用自己的算法,但必须在调用自身前有条件判断,否则无限调用下去,也就是所谓的死循环

递归在项目中用到比较多的地方是获取商品分类或者其他的分类,以及邀请人等等~还有一些比如阶乘,斐波那契数列,汉诺塔也用到了递归算法

首先来说说什么是无限极分类。按照我的理解,就是对数据完成多次分类,如同一棵树一样,从根开始,到主干、枝干、叶子,网络上很多无限级的分类,但无非是两种,一种是递归算法,一种是非递归算法

无限级分类是一种分类技巧,例如部门组织,文章分类,学科分类等常用到无限级分类,将其简单理解成分类就好了。其实我们仔细想一下,生活中的分类简直太多了,衣服可以分为男装和女装,也可以分为上衣和裤子,也可以根据年龄段分类

递归点:发现当前问题可以有解决当期问题的函数,去解决规模比当前小一点的问题来解决

递归出口:当问题解决的时候,已经到达(必须有)最优子问题,不能再次调用函数

如果一个函数递归调用自己而没有递归出口:就是死循环

递归的本质是函数调用函数,一个函数需要开辟一块内存空间,递归会出现同时调用N多个函数(自己),递归的本质是利用空间换时间

项目中需要获取分类或者查询用户邀请人的时候,一般都是直接将所有所有数据查出来,然后调用递归方法去实现逻辑,这样也节省了不少时间,也就是上面所说的空间换时间

这里用我在项目中做的一个查询某一用户的下级作为演示,表里存的数据一般都是在每一个用户的数据中加上一个inv_id

/**
 * 获取用户ID
 */
public function actionGetUserId()
{
    $model = new UserModel();
    $userInfo = $model::find()->where(['level'=> 13])->asArray()->all();
    $userId = $this->getInvId($userInfo,61);
    var_dump($userId);
}

接着调用有递归算法的方法

public function getInvId($data, $invId)
{
    static $arr = [];
    foreach ($data as $key => $val) {
        if ($val['inv_id'] == $invId) {
            $arr[] = $val['id'];
            $this->getTree($data, $val['id']);
        }
    }
    return $arr;
}

递归另一个令人印象深刻的就是简单事情重复做。自上而下分解后,每一步是在更小规模上解决同一个模块化的问题,最终再以堆栈式的结构回溯

沈唁志|一个PHPer的成长之路! 原创文章采用CC BY-NC-SA 4.0协议进行许可,转载请注明:转载自:PHP使用递归算法查找子集获取无限极分类等实操

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏SimpleAI

Hello,1024背后可爱的人儿

15640
来自专栏祝威廉

从DataFrame自动化特征抽取的尝试

虽然提供了很多Estimator/Transformer, 正如这篇文章所显示的,如何基于SDL+TensorFlow/SK-Learn开发NLP程序,处理的代...

9430
来自专栏灯塔大数据

每周学点大数据 | No.12数据流中的频繁元素

No.12期 数据流中的频繁元素 Mr. 王:我们再来讲一个例子,数据流中的频繁元素。我们先来说说大数据的数据流模型。 小可:数据流,是流动的数据的意思吗?和...

33970
来自专栏算法修养

矩阵快速幂小结

      矩阵快速幂大概是用来解决这样一类问题,当你知道了一个递推式比如a[n]=a[n-1]+a[n-2] 题目要求你求出a[n]。如果n大于1亿怎么办? ...

33750
来自专栏章鱼的慢慢技术路

《算法图解》第一章笔记与课后练习_二分查找算法

23840
来自专栏C语言C++游戏编程

400行代码编C语言控制台界版2048游戏,编写疯子一样的C语言代码

《2048》是最近比较流行的一款数字游戏。原版2048首先在github上发布,原作者是Gabriele Cirulli。它是基于《1024》和《小3传奇》(T...

21000
来自专栏数据结构与算法

42:出书最多

42:出书最多 查看 提交 统计 提问 总时间限制: 1000ms 内存限制: 65536kB描述 假定图书馆新进了m(10 ≤ m ≤ 999)本图书,它们...

29250
来自专栏xingoo, 一个梦想做发明家的程序员

剑指OFFER之最大子向量和(连续子数组的最大和)(九度OJ1372)

题目描述: HZ偶尔会拿些专业问题来忽悠那些非计算机专业的同学。今天JOBDU测试组开完会后,他又发话了:在古老的一维模式识别中,常常需要计算连续子向量的最大和...

222100
来自专栏潇涧技术专栏

Python Algorithms - C8 Dynamic Programming

Python算法设计篇(8) Chapter 8 Tangled Dependencies and Memoization

12030
来自专栏诸葛青云的专栏

C语言控制台界版2048游戏-既然是这样的!

《2048》是最近比较流行的一款数字游戏。原版2048首先在github上发布,原作者是Gabriele Cirulli。它是基于《1024》和《小3传奇》(T...

12600

扫码关注云+社区

领取腾讯云代金券