2016-06-03 28 views
0

Ich habe eine Startnummer, so dass die Zahl multipliziert werden muss, nur bei Startzyklus, um einen Faktor, dann multipliziert die Ergebnisse X-mal für einen anderen Faktor, dann muss der Zyklus für Y multipliziert werden mal, und am Ende muss ich die Gesamtsumme haben ... Ich denke, das ist besser, um die Zahlen zu sehen, was ich haben mussJavaScript Mathe, Schleifen in Loops

Zum Beispiel, wenn ich mit der Nummer 10 beginne, ist dies das richtige Progression:

  • 50 (10 * 5)
  • 60 (50 * 1,2)
  • 72 (60 * 1,2)
  • 86,4 (72 * 1,2)
  • 103,68 (86,4 * 1,2)
  • 124,416 (103,68 * 1,2)

für mich die ersten 6 ist der innere Zyklus von jetzt an, ich brauche die Vorarb zu replizieren, aber ich hatte den letzten Wert zu verwenden, 124,416, multipliziert mit 5 dann für 1,2 wieder, so

  • 622,08 (124,416 * 5)
  • 746,496 (622,08 * 1,2)
  • 895,7952 (746,496 * 1,2)
  • 1074,95424 (895,7952 * 1,2)
  • 1289,94509 (1074,95424 * 1,2)
  • 1547,93411 (1289,94509 * 1,2)
  • 1857,52093 (1547,93411 * 1,2)

und so weiter ...

und am Ende muss ich all diese Zwischenergebnisse zusammenzufassen, 10 + 50 + 60 + 72 ...

Ich habe versucht, dies zu tun, aber ist nicht das, was ich brauche, der innere Zyklus funktioniert wie ausgesetzt, aber wenn ich den äußeren Zyklus addieren, geht alles schief!

outtercycle = 5; 
base = 10; 
mult1 = 5; 
mult2 = 1.2; 
innercycle = 6; 

aaa = 0; 
number = 0; 

function test() 
{ 
    for (j = 0; j < outtercycle; j++) { 
     aaa = base * mult1; 
     number += aaa; 
     for (i = 0; i < (innercycle - 1); i++) { 
      aaa *= mult2; 
      number += aaa; 
     } 
    } 
return number + base; 
} 

base = test(); 

Auf dem Code, den ich brauche 5 outter Zyklen haben, aber ich bin Tests es nur auf 2, ist es das gleiche wie ich glaube, wenn das funktioniert, funktioniert mit jedem Variablenwert, nicht wahr?

Irgendeine Idee über dieses kleine Problem?

+1

Es würde helfen, wenn a) Sie didnt die Variable 'base' Wiederverwendung sowohl innerhalb als auch außerhalb der Funktion und b) verwendet aussagekräftige Variablennamen anstelle von' aaa' – Jamiec

+0

Sind Sie sicher, dass Sie jede äußere beginnen Zyklus mit 'aaa = Basis * mult1;'? Klingt eher so, als würde man 'aaa = base' außerhalb der Loops initialisieren und' aaa * = mult1' im äußeren Zyklus verwenden. – Bergi

Antwort

1

Brechen Sie dies in zwei Schritte - es ist einfacher, den Kopf zu wickeln.

  1. akkumulieren alle Werte in einem Array
  2. Summe alle Zahlen im Array

function getValues(start, outerCycle, outerMulti, innerCycle, innerMulti){ 
 
    var result = [start]; 
 
    var idx = 0; 
 
    for(var i = 0;i<outerCycle;i++){ 
 
     result.push(result[idx] * outerMulti); 
 
     idx++; 
 
     for(var j=0;j<innerCycle;j++){ 
 
      result.push(result[idx] * innerMulti); 
 
      idx++; 
 
     } 
 
    } 
 
    return result; 
 
} 
 

 
var values = getValues(10,2,5,5,1.2); 
 
console.log('values', values); 
 
var sum = values.reduce(function(a,b){ return a + b; }); 
 
console.log('sum', sum);

+0

Wow, erstaunliches Ergebnis, ich kam nie zu dieser Lösung! Tnx –

1

Sie eine einzelne Schleife mit einem Array verwenden könnte für den Faktor.

function getValues(value, factor, loops) { 
 
    var array = [value], i; 
 
    for (i = 0; i < loops; i++) { 
 
     value *= factor[+!!i]; // +!!i returns 0 if 0 otherwise 1 
 
     array.push(value); 
 
    } 
 
    return array; 
 
} 
 

 
var values= getValues(10, [5, 1.2], 6), 
 
    sum = values.reduce(function (a, b) { return a + b; }, 0); 
 

 
console.log(values); 
 
console.log(sum);

0

Sie können mit Rekursion:

function values(seed, cycles, notFirstRun) { 
 
    var mult1 = 5, mult2 = 1.2, result = []; 
 

 
    if (!notFirstRun) result.push(seed); 
 
    result.push(seed * mult1); 
 

 
    for (var i = 0; i < 5; i++) { 
 
    result.push(result[result.length-1] * mult2); 
 
    } 
 
    if (cycles > 1) { 
 
    result = result.concat(values(result[result.length-1], cycles-1, true)); 
 
    } 
 
    return result; 
 
} 
 

 
var r = values(10,2) 
 
console.log('r: ', r); 
 
var sum = r.reduce(function(a, b){return a+b;}); 
 
console.log('sum:', sum); 
 

 
var r = values(10,5) 
 
console.log('r: ', r); 
 
var sum = r.reduce(function(a, b){return a+b;}); 
 
console.log('sum:', sum);

Oder in einer einzigen Funktion simplyfing:

function mySum(seed, cycles, notFirstRun) { 
 
    var mult1 = 5, mult2 = 1.2, result = []; 
 

 
    if (!notFirstRun) result.push(seed); 
 
    result.push(seed * mult1); 
 

 
    for (var i = 0; i < 5; i++) { 
 
    result.push(result[result.length-1] * mult2); 
 
    } 
 
    if (cycles > 1) { 
 
    result = result.concat(mySum(result[result.length-1], cycles-1, true)); 
 
    } 
 
    if (notFirstRun) { 
 
    return result; 
 
    } else { 
 
    return result.reduce(function(a, b){return a+b;}); 
 
    } 
 
} 
 

 
var s = mySum(10,2) 
 
console.log('sum: ', s); 
 

 
s = mySum(10,5) 
 
console.log('sum: ', s);