математика — Какая самая быстрая факторная функция в JavaScript?

Какая самая быстрая факторная функция в JavaScript?

 function isNumeric(n) { return !isNaN(parseFloat(n)) {amp}amp;{amp}amp; isFinite(n) } 

Предоставлено http://javascript.info/tutorial/number-math как простой способ оценить, является ли объект правильным целым числом для вычисления.

 var factorials=[[1,2,6],3]; 

Простой набор Memoized факториалов, которые требуют избыточных вычислений, может быть обработан с «умножением на 1», или представляют собой одну цифру, которая является простым уравнением, которое не стоит обрабатывать в реальном времени.

 var factorial = (function(memo,n) { this.memomize = (function(n) { var ni=n-1; if(factorials[1]{amp}lt;n) { factorials[0][ni]=0; for(var factorial_index=factorials[1]-1;factorials[1]{amp}lt;n;factorial_index  ) { factorials[0][factorials[1]]=factorials[0][factorial_index]*(factorials[1] 1); factorials[1]  ; } } }); this.factorialize = (function(n) { return (n{amp}lt;3)?n:(factorialize(n-1)*n); }); if(isNumeric(n)) { if(memo===true) { this.memomize(n); return factorials[0][n-1]; } return this.factorialize(n); } return factorials; }); 

Изучив входные данные других участников (исключая рекомендации журнала, хотя я могу реализовать это позже), я продолжил и составил довольно простой сценарий. Я начал с простого необразованного примера JavaScript ООП и создал небольшой класс для обработки факториалов. Затем я реализовал свою версию Memoization, которая была предложена выше. Я также реализовал сокращенную факториализацию, однако внес небольшую поправку на ошибки; Я изменил «n {amp}lt;2» на «n {amp}lt;3». «n {amp}lt;2» все равно будет обрабатывать n = 2, что будет пустой тратой, потому что вы итерируете для 2 * 1 = 2; это пустая трата на мой взгляд. Я изменил его на «п {amp}lt;3»; потому что, если n равно 1 или 2, оно просто вернет n, если оно равно 3 или более, оно будет оцениваться нормально. Конечно, когда применяются правила, я разместил свои функции в порядке убывания предполагаемого выполнения. Я добавил опцию bool (true | false), чтобы быстро переключаться между memo’ом и обычным исполнением (вы просто никогда не знаете, когда хотите поменяться местами на своей странице, не меняя «стиль»). Как я уже говорил ранее, Переменная memoized factorials устанавливается с 3 начальными позициями, занимая 4 символа и сводя к минимуму расточительные вычисления. Все после третьей итерации вы обрабатываете двузначную математику плюс. Я полагаю, что если вы достаточно сторонник этого, вы будете работать на факториальной таблице (как реализовано).

Что я запланировал после этого? локальное и | сессионное хранилище, чтобы учесть индивидуальный кэш необходимых итераций, по сути, решая проблему «таблиц», о которой говорилось выше. Это также значительно сэкономило бы пространство базы данных и сервера. Однако, если вы используете localStorage, вы, по сути, будете занимать место на компьютере пользователя, чтобы просто сохранить список чисел и сделать их экран более быстрым, но в течение длительного периода времени с огромной потребностью это будет медленным. Я думаю, что sessionStorage (очистка после табуляции) будет гораздо лучшим маршрутом. Возможно объединить это с самобалансирующимся сервером / локальным зависимым кэшем? Пользователь A нуждается в X итерациях. Пользователю B нужны Y итераций. X Y / 2 = Необходимое количество локально кэшируется Затем просто найдите и поиграйтесь с эталонами времени загрузки и выполнения для каждого пользователя, пока он не настроится на оптимизацию для самого сайта. Спасибо!

Изменить 3:

 var f=[1,2,6]; var fc=3; var factorial = (function(memo) { this.memomize = (function(n) { var ni=n-1; if(fc{amp}lt;n) { for(var fi=fc-1;fc{amp}lt;n;fi  ) { f[fc]=f[fi]*(fc 1); fc  ; } } return f[ni]; }); this.factorialize = (function(n) { return (n{amp}lt;3)?n:(factorialize(n-1)*n); }); this.fractal = (function (functio) { return function(n) { if(isNumeric(n)) { return functio(n); } return NaN; } }); if(memo===true) { return this.fractal(memomize); } return this.fractal(factorialize); }); 

Это редактирование реализует другое предложение стека и позволяет мне вызывать функцию как factorial (true) (5), что было одной из моих целей. : 3 Я также удалил некоторые ненужные присваивания и сократил некоторые непубличные имена переменных.

§

Хотя все вышеперечисленные хороши, но все они кажутся мне слишком длинными, поэтому я сделал свой собственный.

 function factorial(n) { //"n" is the number used in the factorial var ans = 1, //define the base variables neg = false, n = Math.round(n); if (n{amp}lt;0 || !n) neg = true; //check if the number is negative or if the number doesn't exist for (var i=1;i{amp}lt;=n;i  ) ans *= i; //the actual repeating code, won't run if the number is less than or equal to 0 return neg ? NaN : ans; //return the answer if the original was positive } 

То, как работает цикл for , автоматически не будет ничего делать с любым числом ниже 1. Таким образом, в основном, «если (Число) меньше или равно 0 , тогда возвращается 1 .

Строки if (n{amp}lt;0 || !n) neg = true; и return neg ? NaN : ans; return neg ? NaN : ans; работать вместе, чтобы сказать «Если число является отрицательным, то вернуть NaN (не число)». Они также проверяют, существует ли число, и возвращают NaN (не число), если число не существует.

По крайней мере, в Chrome v50.0.2661.86 (64-разрядная версия) он имеет максимум 170. Поэтому, если вы запустите эту функцию с числом больше 170 (например, 171), она вернет infinity .

Понравилась статья? Поделиться с друзьями:
JavaScript & TypeScript
Adblock
detector