资讯专栏INFORMATION COLUMN

javascript中的递归

acrazing / 3384人阅读

摘要:二项目中用到的几个经典的递归求的和分析假设递归函数已经写好为,即,就是求的和。递归函数实现每天凌晨定时启动定时器执行代码分析假设递归函数已经写好了。

一、递归的概念

在程序中函数直接或者间接调用自身的一种方法,就叫做递归。它通常把一个大型复杂的问题转化为一个与原问题相似的规模较小的问题来求解,递归策略只需少量的程序就可描述出解题过程中所需要的多次重复计算,大大减少了程序的代码了。

二、项目中用到的几个经典的递归

1. 求1-100的和
分析:

假设递归函数已经写好为sum,即sum(100),就是求1-100的和。

寻找递归关系。sum(n)===sum(n-1)+n。

将临界条件加入到递归中。sum(1)=1。

递归函数实现

function sum(n){
    if(n===1){
      return 1;
    }
    return sum(n-1)+n;
  }
  console.log(sum(100));

2. 每天凌晨定时启动定时器执行代码
分析:

假设递归函数已经写好了timerDay。

寻找递归关系,延迟多少时间递归一次

递归函数实现

function timerDay(functionname){
    var date=new Date();//获取当前时刻
    var nowday=date.getDate();//获取当前日期
    var executionTime=new Date();//执行时间
    executionTime.setDate(nowday+1);//设置第二天凌晨0点20为执行时间
    executionTime.setHours(0);
    executionTime.setMinutes(0);
    executionTime.setSeconds(20);
    return setTimeout(function(){
      functionname();
      timerDay(functionname);
    },executionTime-date);
  }
  function fn(){//具体执行什么内容
    console.log("现在凌晨0点20秒");
  }
  var settimtout=timerDay(fn);

这个递归没有临界点,是一个无线循环执行的递归函数,如果我们想停止递归,我们可以清楚延时定时器。

clearTimeout(settimtout);

3. 将一个数组按照内容递归成树形数组
分析:

定义树形对象

得到根节点

得到子节点(得到子节点一级一级数据用到了递归)

var list = [{
    id: 1,
    name: "一级分类:1",
    pid: 0,
  },
  {
    id: 2,
    name: "二级分类:1",
    pid: 1,
  },
  {
    id: 3,
    name: "三级分类:1",
    pid: 2,
  },
  {
    id: 4,
    name: "一级分类:2",
    pid: 0,
  }];
function treeObj(originObj) { //定义树形对象
  var obj = {};
  obj.id = originObj.id;
  obj.name = originObj.name;
  obj.pid = originObj.pid;
  obj["children"] = [];
  return obj;
}

function isRootNode(pid, list) { //判断是否是根节点
  for (var i = 0; i < list.length; i++) {
    var item = list[i];
    if (item && item.id === pid) {
      return false
    }
  }
  return true;
}

function getRootNodes(list) { //得到根节点
  var rootNodes = [];
  for (var i = 0; i < list.length; i++) {
    var item = list[i];
    if (isRootNode(item.pid, list)) {
      rootNodes.push(treeObj(item));
    }
  }
  return rootNodes;
}

function getChildNodes(rootNodes, list) { //遍历获取子节点
  if (list.length !== 0) {
    for (var i = 0; i < rootNodes.length; i++) {
      for (var j = 0; j < list.length; j++) {
        if (rootNodes[i].id === list[j].pid) {
          rootNodes[i].children.push(treeObj(list[j]));
        }
      }
      getChildNodes(rootNodes[i].children, list); //递归遍历子节点
    }
  }
  return rootNodes;
}

var result = [];
if (list === undefined || list.length === 0) {
  result = [];
} else {
  var rootNodes = getRootNodes(list);
  result = getChildNodes(rootNodes, list);
  console.log(result);
}

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/96815.html

相关文章

  • JavaScript专题之递归

    摘要:专题系列第十八篇,讲解递归和尾递归定义程序调用自身的编程技巧称为递归。然而非尾调用函数,就会创建多个执行上下文压入执行上下文栈。所以我们只用把阶乘函数改造成一个尾递归形式,就可以避免创建那么多的执行上下文。 JavaScript 专题系列第十八篇,讲解递归和尾递归 定义 程序调用自身的编程技巧称为递归(recursion)。 阶乘 以阶乘为例: function factorial(n...

    asoren 评论0 收藏0
  • ES6函数与Lambda演算

    摘要:高阶函数函数式编程中,接受函数作为参数,或者返回一个函数作为结果的函数通常就被称为高阶函数。均属于高阶函数,高阶函数并不神秘,我们日常编程也会用到。参考演算函数式编程指南入门康托尔哥德尔图灵永恒的金色对角线原文函数与演算 缘起 造了一个轮子,根据GitHub项目地址,生成项目目录树,直观的展现项目结构,以便于介绍项目。欢迎Star。 repository-tree 技术栈: ES6 ...

    fasss 评论0 收藏0
  • 翻译连载 | 第 9 章:递归(上)-《JavaScript轻量级函数式编程》 |《你不知道的JS》

    摘要:一旦我们满足了基本条件值为,我们将不再调用递归函数,只是有效地执行了。递归深谙函数式编程之精髓,最被广泛引证的原因是,在调用栈中,递归把大部分显式状态跟踪换为了隐式状态。 原文地址:Functional-Light-JS 原文作者:Kyle Simpson-《You-Dont-Know-JS》作者 关于译者:这是一个流淌着沪江血液的纯粹工程:认真,是 HTML 最坚实的梁柱;...

    MasonEast 评论0 收藏0
  • 数据结构和算法类面试题javascript代码实现

    摘要:正文面试题重建二叉树题目输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。前序遍历序列为,中序遍历序列,。确定了左右子树后递归处理。方法方法面试题在时间删除链表结点。 写在前面 本文的题目均来自于剑指offer中的题目,题目序号保持了书中的题目序号,由于某些题目并不适合于javascript这种语言,所以这些题目就没有写在本篇博客中,因此会出现题目序号的中断。 正文 面试题6:...

    Dean 评论0 收藏0
  • JavaScript中的递归

    摘要:第三次第四次设想,如果传入的参数值特别大,那么这个调用栈将会非常之大,最终可能超出调用栈的缓存大小而崩溃导致程序执行失败。注意尾递归不一定会将你的代码执行速度提高相反,可能会变慢。 译者按: 程序员应该知道递归,但是你真的知道是怎么回事么? 原文: All About Recursion, PTC, TCO and STC in JavaScript 译者: Fundebug ...

    Jacendfeng 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<