похоже, ваш метод определения вашего шага немного не в порядке.
Давайте сначала посмотрим, как определить правильный шаг.
Вот наш тестовый диапазон:
[1,3,6,10,15].
Разница между числами составляет [2,3,4,5], мы можем представить различия как: x + 1, x + 2, x + 3, x + 4. поэтому мы можем объединить их в 4x + 10. Это наше общее число увеличилось, и оно равняется нашему стоп-старту (15 - 1), который равен 14.
так что наше пересмотренное уравнение 14 = 4x + 10, которое при решении дает нам x = 1;
4 здесь представляет количество шагов, а 10 является суммой количества шагов.
мы можем использовать формулу Карла Гаусса, чтобы определить сумму.
формула (n / 2) (первое число + последнее число) = сумма
здесь n - количество шагов. и в нашем уравнении число шагов всегда будет равно 1. 1. Последнее число всегда будет равно 1.
так что наша переведенная формула Гаусса равна (len - 1) / 2 * (len - 1 + 1)
Затем мы включаем это в нашу формулу, чтобы определить шаг:
шаг =
(Math.abs (стоп - старт) - (len - 1) / 2 * (len - 1 + 1)) / (len - 1)
ПРОПУСТИТЕ ЗДЕСЬ, ЕСЛИ ВЫ НЕ ЗАИНТЕРЕСОВАНЫ В МАТЕМАТИКЕ, ЧТОБЫ НАЙТИ ШАГ
Хорошо. Теперь, когда мы правильно нашли шаг. давайте посмотрим код.
function ranger(start = 0, stop = 0, len = 1) {
let incArray = [];
let step = (Math.abs(stop - start) - (len - 1)/2*(len - 1 + 1))/(len - 1);
console.log('step is', step);
if(start < stop){
for(var i = 0, currentValue = start; currentValue < stop; i++){
//use default value on our first iteration of the loop
if(i> 0){
//we are grabbing the previous item in the array and adding
//the step plus i to it
//for ranger(1, 15, 5)) when i = 1, step = 1, incArray[1], so
// current value = 1 + 1 + 1 = 3;
currentValue = (i + step + incArray[incArray.length -1])
}
incArray.push(currentValue)
}
}
else{
for(var i = len, currentValue = start; currentValue > stop; i--){
if(i< len ){
currentValue = (-(i + step) + incArray[incArray.length -1])
}
incArray.push(currentValue)
prevValue = currentValue;
}
}
return incArray;
}
console.log('asc', ranger(1, 15, 5));
console.log('asc', ranger(1, 21, 6));
console.log('desc', ranger(15, 1, 5));
//now try a range with a step of 2:
console.log('asc', ranger(1, 19, 5));
// asc (5) [1, 3, 6, 10, 15]
// desc (5) [15, 10, 6, 3, 1]
Это всего лишь черновик, поэтому вы можете аккуратно выполнить рефакторинг с картой и заставить его работать более динамично для подъема и спуска.