То, что вы, похоже, хотите, это арифмети c прогрессия . Это последовательность чисел, где между ними есть общая разница, например 1, 4, 7, 10
будет арифметической c последовательностью, где разница составляет 3
между каждым последующим элементом.
Более обобщенное представление арифметика c прогрессия
a, a + d, a + 2d, a + 3d, ..., a + nd`
где a
ваш начальный член , d
это разница , а n
это длина серии.
Формула для суммы арифметических рядов c выглядит следующим образом:
S = (n/2) * (2*a + (n - 1)*d)
Что выглядит сложным, давайте просто посмотрим на это в действии. Допустим, мы хотим сложить серию 1, 2, 3, 4, 5, 6, 7, 8, 9, 10
. Или целые числа от 1 до 10. Подставляя в формулу, мы имеем a = 1
, d = 1
, n = 10
и получаем
S = (10/2) * (2*1 + (10 - 1)*1)
= 5 * (2 + 9*1)
= 5 * (2 + 9)
= 5 * 11
= 55
И мы можем просто написать код для проверки:
const sum = 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10;
console.log(sum);
Итак, формула работает.
Теперь мы хотим перетасовать вещи - у нас есть S
, для общей вместимости опыта дерева , у нас также есть n
число ветвей , и у нас есть a
, что будет нулем для начальной ветви. Нам просто нужно найти d
, чтобы получить все, что нам нужно. Итак, вот так:
S = (n/2) * (2*a + (n - 1)*d)
S / (n/2) = 2*a + (n - 1)*d
(S / (n/2)) - 2*a = (n - 1)*d
((S / (n/2)) - 2*a) / (n - 1) = d
Мы можем на самом деле исключить 2*a
, поскольку мы знаем a = 0
, поэтому мы можем немного упростить формулу:
(S / (n/2)) / (n - 1) = d
И готово. Теперь мы можем просто закодировать его в функцию:
// S = totalExperience
// n = branches
function findArithmeticStep(totalExperience, branches) {
return (totalExperience / (branches/2)) / (branches - 1);
}
console.log(findArithmeticStep(600, 4));
Вы даже можете использовать функцию генератора, которая предоставит вам следующее значение XP:
// S = totalExperience
// n = branches
function findArithmeticStep(totalExperience, branches) {
return (totalExperience / (branches/2)) / (branches - 1);
}
function* nextXPCost(totalExperience, branches) {
const step = findArithmeticStep(totalExperience, branches);
let currentXPCost = 0;
for(let i = 0; i < branches; i++) {
yield currentXPCost;
currentXPCost += step;
}
}
const gen = nextXPCost(600, 4);
//1 - 0
let next = gen.next();
console.log(next.value, next.done);
//2 - 100
next = gen.next();
console.log(next.value, next.done);
//3 - 200
next = gen.next();
console.log(next.value, next.done);
//4 - 300
next = gen.next();
console.log(next.value, next.done);
//5 - getting after the end
next = gen.next();
console.log(next.value, next.done);
//generate an array of all costs
const allCostsTree1 = [...nextXPCost(600, 4)];
console.log(allCostsTree1);
//generate a different tree with higher total cost
const allCostsTree2 = [...nextXPCost(2000, 5)];
console.log(allCostsTree2)