2012-11-19 42 views
2

努力写这段代码。递归加法

我想从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" 
       .... 

建议?

+1

当然,你需要做的就是在S1,S2和S3中找到'Pn'的最高值并将它们加在一起。 –

+0

感谢@MattBurland的回应。除了最高值只能用一个“S”,那么我需要弄清楚哪个“S”使用“P” – timborden

+0

[确定正确的组合]有什么区别(http://stackoverflow.com /问题/ 13277834 /确定最合适的组合)? – Bergi

回答

0

感谢球员....我想我已经有了一些工作。

我改变了我的对象:

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); 

....似乎工作。

6

由于a + b > a + c任何a和所有b > c,你就不能得到每个S1S2S3 ...并添加这些共同的最大值?

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

+0

感谢您的回复@Kolink。我正在努力使用只能使用一次的“P”值。 – timborden