如何快速写出一个递归程序

想必大家对递归程序并不陌生,比如大家都非常熟悉的求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);
     })
   }

通过此文你是否对递归有了更深刻的认识呢,相信后面再写递归程序的时候你会更加的得心应手。

发表评论