使用递归js在树状对象中查找最小值和最大值

Posted

技术标签:

【中文标题】使用递归js在树状对象中查找最小值和最大值【英文标题】:Find minimal and maximum values in a tree like object using recursion js 【发布时间】:2021-12-08 08:11:39 【问题描述】:

我正在尝试使用递归在树状对象中查找最小值和最大值,但我实际上并不了解如何找到这些值。此外,我的函数必须是纯函数,不能使用循环或 forEach。只有 map、reduce、filter 可用。所以这就是我的数据的样子:

const tree = 
children: [ 
     
        children: [
             
                children: [],
                values: [15.667786122807836]
            
        ],
        values: [35.77483035532576, 1.056418140526505]
    ,
    
        children: [
            
                children: [
                    
                        children: [],
                        values: [67.83058067285563]
                    
                ],
                values: [98.89823527559626]
            
        ],
        values: [51.49890385802418, 41.85766285823911]
    ,
],
values: [6.852857017193847, 28.110428400306265, 51.385186145220494];

我正在尝试做这样的事情:

const min = graph => 
if (!graph.children.length && !graph.values.length) return;

if (!graph.children.length && graph.values.length) 
    return Math.min(...graph.values);


return graph.children.map(el => 
    const minValue = Math.min(...el.values);
    min(el);
    return minValue;
);

;

但这并不好用。所以任何人都可以解释调用堆栈是如何工作的,也许给我一些很好的例子,并解释如何解决我的问题。感谢您的帮助,抱歉英语不好)。哦,还有))如何获取不同深度级别的两个节点之间的距离?

【问题讨论】:

你意识到map、reduce和filter都是循环对吧?见:Find the minimum and maximum values in the nested object 感谢您的帮助,好帖子! 【参考方案1】:

通常有家庭作业问题,我会提示与 OP 进行更多对话,但由于这已经有一个可行的、可接受的答案,我将添加一个更简单的答案:

const min = (values = [], children = []) => 
  Math .min (...values, ... children .map (min))

const tree = children: [children: [children: [], values: [15.667786122807836]], values: [35.77483035532576, 1.056418140526505], children: [children: [children: [], values: [67.83058067285563]], values: [98.89823527559626]], values: [51.49890385802418, 41.85766285823911], ], values: [6.852857017193847, 28.110428400306265, 51.385186145220494];

console .log (min (tree))

我们只使用Math.min,将当前值和对其每个子级递归调用的结果传播到它的参数中。我们默认 valueschildren 为空数组,以防任何一个节点丢失。

显然max 对此进行了微不足道的更改。

【讨论】:

看起来很简单),谢谢 Scott,终于在你和 Johnny Mopp 的帮助下,我终于开始了解递归调用的工作原理以及它们何时返回值【参考方案2】:

我不是 JS 程序员,但我一直在寻求实践。这是我想出的:

const tree = 
  children: [
      children: [
        children: [],
        values: [15.667786122807836]
      ],
      values: [35.77483035532576, 1.056418140526505]
    ,
    
      children: [
        children: [
          children: [],
          values: [67.83058067285563]
        ],
        values: [98.89823527559626]
      ],
      values: [51.49890385802418, 41.85766285823911]
    ,
  ],
  values: [6.852857017193847, 28.110428400306265, 51.385186145220494]
;

function treeMin(graph) 
  if (graph.children.length == 0) return Math.min(...graph.values);
  return Math.min(...graph.values,
                  graph.children.reduce((prev, cur) =>
                     Math.min(prev, treeMin(cur)), Number.MAX_SAFE_INTEGER
                  ));


console.log(treeMin(tree));

我为函数命名以进行递归调用。它做的第一件事是检查是否没有孩子。如果不是,它只返回值的最小值。

如果有孩子,则返回最小值和对孩子调用reduce 的结果。在reduce 内部,进行了递归调用。

注意:它不处理values 为空的情况。这很容易添加。

【讨论】:

非常感谢,我尝试了许多不同的组合,但您的示例正是我所需要的。顺便说一句,你不知道我如何获取两点之间的距离,例如 min 和 max?

以上是关于使用递归js在树状对象中查找最小值和最大值的主要内容,如果未能解决你的问题,请参考以下文章

Javascript:使用 reduce() 查找最小值和最大值?

在给定数组中查找最小值和最大值,其中约束应最小值索引应小于其最大值

在数组中查找最小值和最大值

查找金属纹理中的最小值和最大值

在 Vba 列的范围内查找最小值和最大值

查找每行的最小值和最大值,不包括 NaN 值