【问题标题】:Simplifying recursive function (and making it more functional)简化递归函数(并使其更具功能性)
【发布时间】:2015-08-19 12:42:29
【问题描述】:

我有这个递归函数,它旨在递归地遍历容器对象的级别并检查它们是否打开。同时,我需要返回一个计数器,该计数器为每个级别的嵌套容器递增,其中包含一个未打开的容器。

所以容器结构可能看起来像这样(但是函数需要是动态的):

container {
    open: true,
    containers: [
        {
            open: false,
            containers: [

                    {
                        open: false,
                        containers: [

                        ]
                    },
                    {
                        open: false,
                        containers: [

                        ]
                    },
                    {
                        open: false,
                        containers: [

                        ]
                    },
            ]
        },
        {
            open: true,
            containers: [

                    {
                        open: false,
                        containers: [

                        ]
                    },
                    {
                        open: true,
                        containers: [

                        ]
                    },
                    {
                        open: false,
                        containers: [

                        ]
                    },
            ]
        }
    ]
}

目前我已经编写了一个函数,它将遍历 4 级容器进行检查,但我想让它尽可能长时间地运行。

function checkChildren(container) {
      var x = 0;
      if(closedCheck(container)) {
        x++;
        if(loopCheck(closedCheck(container), closedCheck)) {
          x++;
          if(loopCheck(loopCheck(closedCheck(container), closedCheck), closedCheck)) {
            x++;
            if(loopCheck(loopCheck(loopCheck(closedCheck(container), closedCheck), closedCheck), closedCheck)) {
              x++;
            }
          }
        }
      }

      return x;

      function closedCheck(container) {
        if(typeof container.containers !== 'undefined') {
          return container.containers.filter(function(val) {
            return val.open === false;
          })
        } else return false;
      }

      function loopCheck(containers, callback) {
        return containers.filter(callback);
      }
    }

t 遍历容器的每一层。例如,第一级是根 container.containers。第二级包括第一级中每个容器中的“容器”数组。对于具有“打开 === false”的容器的每个级别,计数器都会递增。在这种情况下,计数器是根据迭代或条件增加或减少的数字。预期输出是代表该计数器的数字。因此,如果我要为根容器调用此函数。结果将是 2,因为下面两层是一个封闭的容器。

有没有人知道如何简化它并使其更具动态性?

谢谢!

【问题讨论】:

  • 预期输出是什么?
  • "一个计数器,对于每个级别的嵌套容器都有一个未打开的容器'
  • @Rorschach120:我相信这对你来说很有意义,但对其他人来说却不是。你能解释清楚一点吗?对于您给出的示例,您应该执行什么功能以及输出应该是什么?是2吗?或3?或6?
  • 遍历容器的每一层。例如,第一级是根 container.containers。第二级包括第一级中每个容器中的“容器”数组。对于具有“打开 === false”的容器的每个级别,计数器都会递增。在这种情况下,计数器是根据迭代或条件增加或减少的数字。预期输出是代表该计数器的数字。因此,如果我要为根容器调用此函数。结果将是 2,因为下面两层是一个封闭的容器。
  • The result would be 2 since two levels down there is a closed container. 这确实与您最初所说的不符。听起来您只是想知道 deepest 封闭容器有多少层。那是对的吗?即使那个容器本身就在一个封闭的容器中?

标签: javascript recursion functional-programming


【解决方案1】:

可能是这样的:

function findDeepest(obj,lvl) {
    if (!obj) {
        return 0;
    }
    if (!obj.open) {
        return lvl;
    }
    if (!obj.containers || !obj.containers.length) {
        return 0;
    }
    var subTrees = obj.containers.map(function (item) {
        return findDeepest(item,lvl+1);
    });
    return Math.max.apply(Math, subTrees);
}

console.log(findDeepest(container ,0));

我们的想法是,我们从顶部(0 级)开始,如果该对象是打开的,那么我们会向下遍历所有子对象,直到找到封闭的容器,然后我们选择其中的最大值(即最深)并返回它.

【讨论】:

  • 谢谢,这真的很接近。尽管即使容器关闭,我也需要它继续检查。很抱歉,我的评论是不正确的,有点脑筋急转弯。我正在初始化所有这些容器,并且设置为“打开:false”的容器已关闭,但我遇到了父容器试图与其子容器同时关闭并破坏东西的问题。所以我有一个包含“closeContainer()”函数的“$timeout”,但超时时间设置为“checkChildren(container) * 30”。如果函数在 'if(!obj.open)' 处返回,它将永远不会到达子树。
猜你喜欢
  • 2021-12-17
  • 2011-05-28
  • 2014-07-06
  • 1970-01-01
  • 1970-01-01
  • 2013-08-24
  • 2016-02-20
  • 1970-01-01
相关资源
最近更新 更多