【问题标题】:How to create a list of a list of integers based on a tree of Or and And objects?如何基于 Or 和 And 对象的树创建整数列表的列表?
【发布时间】:2021-12-24 06:08:45
【问题描述】:

我想要这个结果:

[[1,2],[1,3],[1,4,5,6],[1,4,5,7]]

来自以下一组对象:

var andsOrs = 
  Ands(items: [
    single(1),
    Ors(items: [
      single(2),
      single(3),
      Ands(items: [
        single(4),
        single(5),
        Ors(items: [
          single(6),
          single(7),
        ]),
      ]),
    ]),
  ]);

我正在努力编写一个能够产生输出的函数,有人可以帮忙吗?任何现代的面向对象语言都可以,c#、js、dart、c++。

【问题讨论】:

    标签: c# algorithm dart recursion


    【解决方案1】:

    如果我理解正确,您正在寻找名为 AndsOrssingle 的函数,它们将提供所需的结果。所需结果的格式是一个二维数组,其中内部数组列出了经过 AND 运算的原子值,外部数组列出了经过 OR 运算的项目。

    这些函数中的每一个都应返回该格式,也应返回 single。例如,single(1) 应该返回 [[1]]

    Ors 函数应该将它作为参数获取的 2D 项连接到更长的 2D 数组中。因此,例如,Ors 得到两个项目:[[1,2]][[3,4],[5,6]],那么返回值应该是 [[1,2],[3,4],[5,6]]

    更复杂的是Ands:它应该对得到的参数执行笛卡尔积。

    这是 JavaScript 中的一个实现。输入的符号有点不同,因为 items: 作为函数参数将是无效的语法。我们可以将每个项目作为单独的参数传递并使用扩展语法:

    function single(i) {
        return [[i]];
    }
    
    function Ands(first, ...rest) {
        // Cartesian product, using recursion
        if (!rest.length) return first;
        let restResult = Ands(...rest);
        let result = [];
        for (let option of first) {
            for (let restOption of restResult) {
                result.push([...option, ...restOption]);
            }
        }
        return result;
    }
    
    function Ors(...items) {
        return items.flat(1); // Reduces 1 level of array depth (from 3 to 2)
        // Alternative syntax to get the same result:
        // return [].concat(...items)
    }
    
    var andsOrs = 
      Ands(
        single(1),
        Ors(
          single(2),
          single(3),
          Ands(
            single(4),
            single(5),
            Ors(
              single(6),
              single(7),
            ),
          ),
        ),
      );
    
    console.log(andsOrs);

    【讨论】:

    • 太好了,非常感谢@trincot,我实际上只是想通了,但希望这是一个不错的小测验。经过这么多年的编程,我仍然对这些类型的函数感到困惑!我认为任何带有递归的东西最初都会让我感到困惑。写出来有帮助。
    猜你喜欢
    • 2021-11-06
    • 1970-01-01
    • 1970-01-01
    • 2023-01-08
    • 1970-01-01
    • 1970-01-01
    • 2021-11-02
    • 1970-01-01
    • 2023-04-02
    相关资源
    最近更新 更多