我正在嘗試使用遞回在樹狀物件中找到最小值和最大值,但我實際上并不了解如何找到這些值。此外,我的函式必須是純函式,不能使用回圈或 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;
});
};
但這效果不佳。因此,任何人都可以解釋呼叫堆疊的作業原理,也許給我一些很好的例子,并解釋如何解決我的問題。感謝您的幫助,并為糟糕的英語感到抱歉)。哦,還有))如何獲得不同深度級別的兩個節點之間的距離?
uj5u.com熱心網友回復:
我不是 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為空的情況。這可以很容易地添加。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/329931.html
標籤:javascript 递归 数据结构 二叉树
上一篇:如何使用串列理解和遞回在Haskell中檢測兩個相鄰的相同字符?
下一篇:如何在以下代碼中使用遞回技術?
