【问题标题】:Recursive addition递归加法
【发布时间】:2012-11-19 18:40:39
【问题描述】:

努力编写这段代码。

我正在尝试计算 2 个对象的最大值。我开始了单独的“S”和“P”对象:

var S = [
    { id: '1', value: '##' },
    { id: '2', value: '##' },
    { id: '3', value: '##' },
    { id: 'N', value: '##' }
];

var P = [
    { id: '1', value: '##' },
    { id: '2', value: '##' },
    { id: '3', value: '##' },
    { id: 'N', value: '##' }
];

我创建了第三个对象:

var myobject = {
    'S1' = {
        'P1' = '25',
        'P2' = '32',
        'P3' = '65',
        'PN' = '##'
    },
    'S2' = {
        'P1' = '24',
        'P2' = '31',
        'P3' = '64',
        'PN' = '##'
    },
    'S3' = {
        'P1' = '26',
        'P2' = '33',
        'P3' = '66',
        'PN' = '##'
    },
    'SN' = {
        'P1' = '##',
        'P2' = '##',
        'P3' = '##',
        'PN' = '##'
    }
};

而且我需要遍历所有值以查看组合产生的最高值,例如:

S1.P1 + S2.P1 + S3.P1 = ?
S1.P1 + S2.P1 + S3.P2 = ?
S1.P1 + S2.P1 + S3.P3 = ?
S1.P1 + S2.P2 + S3.P1 = ?
S1.P1 + S2.P2 + S3.P2 = ?
S1.P1 + S2.P2 + S3.P3 = ?
...

使用上面的示例值,我正在寻找的答案是:

S1.P3 + S2.P3 + S3.P3 = 195

为了使事情复杂化,在某些情况下,“P”值可能只在等式中使用一次:

var P = [
    { id: '1', value: '##' },
    { id: '2', value: '##' },
    { id: '3', value: '##', once: true },
    { id: 'N', value: '##' }
];

如果“P3”只能使用一次,我正在寻找的答案,使用上面的示例值,是:

S1.P2 + S2.P2 + S3.P3 = 129;

我猜这需要一点递归......但我的头很痛。

编辑

我在尝试创建计算的循环中迷路了,例如:

foreach "S"
    foreach "P"
        foreach "S"
            foreach "P"
                ....

建议?

【问题讨论】:

  • 当然,您需要做的就是在 S1、S2 和 S3 中找到 Pn 的最大值并将它们相加。
  • 感谢@MattBurland 的回复。除非最高值只能被一个“S”使用,那么我需要弄清楚哪个“S”使用了“P”
  • @timborden:这很简单。如果Pn 的值仅使用一次,并且在您的集合中多次获得最高值,则只需保留最高值Pn,对于您必须放弃的Sn,选择下一个最高值价值。重复直到满足所有条件。
  • @MattBurland:是的,定点迭代将是必经之路。但是我认为,如果您从 Sn 中删除较高的值,则可能会出现更好的结果,因为取而代之的值可能会干扰其他事物并提供更高的结果。
  • @Bergi:实际上,这是一个很好的观点。如果S 中的下一个最高值接近Pn,我可以通过删除最高的Pn 来获得更好的结果。您必须遍历Pn 的每个实例,并找出哪一个导致的损失最小。

标签: javascript logic


【解决方案1】:

由于a + b > a + c 对任何a 和所有b > c,您不能只从S1S2S3...中获取最大值并将它们加在一起吗?

我不确定我是否完全理解你在做什么,但这应该有助于避免过多的递归。

【讨论】:

  • 感谢@Kolink 的回复。我正在为只能使用一次的“P”值而苦苦挣扎。
【解决方案2】:

谢谢大家......我想我有一些有用的东西。

我将对象更改为:

var myobject = {
    'S1-P1' = '25',
    'S1-P2' = '32',
    'S1-P3' = '65',
    'S1-PN' = '##'
    'S2-P1' = '24',
    'S2-P2' = '31',
    'S2-P3' = '64',
    'S2-PN' = '##'
    'S3-P1' = '26',
    'S3-P2' = '33',
    'S3-P3' = '66',
    'S3-PN' = '##'
    'SN-P1' = '##',
    'SN-P2' = '##',
    'SN-P3' = '##',
    'SN-PN' = '##'
};

...然后运行它:

ids = [];
_.each(S, function(Sn){
    ids.push(Sn.id);
});

var totals = [];
while (ids.length){
    var best = { s_id: null, p_id: null, amount: 0 };
    for (var s1 in myobject) {
        if (best.amount < myobject[s1]){
            id = s1.split('-');
            best = { s_id: id[0], p_id: id[1], amount: myobject[s1] };
        }
    }
    var once = false;
    _.each(P, function(Pn){
        if (Pn.id == best.p_id & Pn.once)
            once = true;
    });
    for (var s2 in myobject) {
        id = s2.split('-');
        if (best.s_id == id[0])
            delete myobject[s2];
        if (once && best.p_id == id[1])
            delete myobject[s2];
    }

    var index = ids.indexOf(best.s_id);
    ids.splice(index, 1);

    totals.push(best);
}
console.log(totals);

....似乎有效。

【讨论】:

    猜你喜欢
    • 2017-11-27
    • 1970-01-01
    • 2017-08-09
    • 2013-03-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-07
    • 1970-01-01
    相关资源
    最近更新 更多