想必大家对递归程序并不陌生,比如大家都非常熟悉的求1到100的和(不陌生吧,哈哈),还有网站开发中渲染具有父子关系的文章或产品分类,这些都离不开递归。可能有些人上手就能写,有些人能看懂但是自己动手却写不出来,或者思维钻到递归程序中拔不出来了。那么如何快速的写出一个递归程序呢?
一、什么是递归
简单来说,程序调用自身的编程技巧就称为递归。一般来说,递归需要有边界条件、递归前进阶段和递归返回阶段。当边界条件不满足时,递归前进;当边界条件满足时,递归返回。
二、递归的意义
递归的意义就在于将问题的规模缩小,并且缩小后问题并没有发生变化,这样就可以继续调用自身来完成接下来的任务。
三、怎样写递归程序
下面以js代码为例来计算数字1到n的和,function sum(n)
1、边界条件
递归方法不可能一直调用下去,需要一个条件来结束递归调用,否则会导致堆栈溢出。
if(n <= 1){
return n;
}
2、递归前进
递归前进的过程就是我们思考的过程。
else{
n += sum(n-1);
return n;
}
在一般的编程实践中,我们通常需要用大脑模拟电脑来执行每一条语句,从而确定编码的正确性,这在递归编码中是不需要的。递归编码的过程中,只需要不断的演进上面的两条就足够了,切不可陷入程序的执行流中!
四、最后以另一个渲染产品分类的实例来结束本文
let category = await api.getCategoryList(); let cates = []; //找出顶级分类,即不存在父级分类的分类 category.forEach((val, index) => { if (!val.parent) { cates.push({ id: val.id, name: val.name, children: [] }); } }); //遍历父级分类 cates.forEach((val, index) => { getCates(val); }); //按照深度优先进行递归获取子级分类 function getCates(val) { let catess = category.filter(v => v.parent && v.parent.id == val.id); //边界条件:catess为空则不会继续调用 catess.forEach((v, i) => { let temp = { id: v.id, name: v.name, children: [] }; val.children.push(temp); //递归前进 getCates(temp); }) }
通过此文你是否对递归有了更深刻的认识呢,相信后面再写递归程序的时候你会更加的得心应手。