Comments 47
Круто, прикольно, но где тут новый способ? Я вижу тут лишь необычную реализацию стандартного способа.
Многие скажут, что первый способ лучше, но это не так. Во-первых, циклы уже не в тренде, сейчас модно функциональное программирование.
Аргументация уровня журнала Cosmopolitan
Такая аргументация называется "социальное доказательство". А когда её используют в таком контексте, это называется "ирония".
Через цикл ведь все равно будет быстрее и короче, не?
Ну, такие заявления нельзя делать без тестов. Нужно замерить перформанс в каждом конкретном случае.
Не совсем понимаю, о каких конкретных случаях речь, я говорил о самом банальном сравнении, которое вы дали в начале.На любом тесте, который бы я не находил на jsPerf, цикл выигрывал с довольно большим отрывом. И да, я не делал заявлений, я как раз таки задал вопрос, так как самому интересно.
Если отвечать серьёзно, то разумеется, цикл будет быстрее рекурсии. Я не уверен, можно ли как-то оптимизировать ещё сильнее, но из наивных реализаций цикл точно самый быстрый.
А разве без теста не очевидно, что в обоих случаях выполняется одно и то же действие (перемножение чисел), только при рекурсии программа «распухает» за счёт вызова функции (самой себя) и передачи (копирования) ей данных?
Вообще да, но в данном случае нет. В то время, как наши космические корабли бороздят просторы вселенной, а в процессорах, компиляторах и интерпретаторах множатся неочевидные оптимизации, очевидных с точки зрения перформанса вещей становятся всё меньше. В комментарии выше я написал «разумеется», поскольку изучил вопрос и выяснил, что в современных js-движках рекурсия не оптимизирована. Без этого знания ответ не является очевидным.
Возможно это и откровение с точки зрения факториала, а вот с точки зрения js кода этому творению место на свалке.
Скажите пожалуйста, а зачем в примере с рекурсией второй параметр? И что в него передается при вызове?
Для реализации хвостовой рекурсии
Ну, собственно, да. Иначе можно было бы написать function factorial(n){return !n? 1: factorial(n-1)}. Но в таком случае, несмотря на то, что рекурсивный вызов стоит последним, это не будет хвостовой рекурсией, потому что последним вычисляемым выражением будет значение тернарного оператора.
Во-вторых, чем больше людей используют второй способ, тем быстрее в основных джаваскриптовых движках появится оптимизация
То есть давайте все ходить через лес, тогда там быстрее появится дорога.
Там, где ходят люди, протаптываются тропинки этими самыми людьми. А потом там кладут асфальт и облагораживают дорожки.
Это если в 10 метрах уже не проложена дорога. По которой все ходят. И тут появляется такой человек, который хочет дорогу на 10 метров ближе к своему дому и говорит: ходите все через лес, в грязь, в снег, тогда через несколько лет тут будет дорога…
А имеющаяся дорога — это циклы.
А имеющаяся дорога — это циклы.
Ваш код настолько идеален, что изобретает новую математику: по мнению вашего алгоритма, 50! = 3. В чем тогда смысл такого запутанного кода, который ни поддерживать, ни отлаживать невозможно?
UFO just landed and posted this here
Господи боже, мы наконец-то дожили до сложения чисел с помощью JQuery!
Сарказм, конечно же, но все-таки…
Сарказм, конечно же, но все-таки…
var React = require("react");
var Factorial = React.createClass({
render: function(){
var result = this.props.result || 1,
n = this.props.n;
if(!n){
return <span>{result}</span>
}else{
return <Factorial n={n - 1} result={result*n}/>
}
}
});
module.exports = Factorial;
Вот это вот? Выглядит солиднее? С кусками разметки? Это как в современном мире называется — шутка, сарказм или что?
Как-то слишком примитивно, я считаю. Нужно подключить несколько фреймворков, зафигачить с десяток микросервисов, общающихся через REST, утащить это всё в облако, подключить CDN… Короче, тема не раскрыта.
const factorial = (n) => Math.sqrt(2 * Math.PI * n) * Math.pow((n / Math.E), n) * Math.exp(1 / (12 * n) - 1 / (360 * n * n * n));
Ну, я в своём первом комментарии упоминал формулу Стирлинга
UFO just landed and posted this here
Да никаких проблем:
var factorial = n => Math.round(Math.sqrt(2 * Math.PI * n) * Math.pow((n / Math.E), n) * Math.exp(1 / (12 * n) - 1 / (360 * n * n * n)));
UFO just landed and posted this here
А он же итак неверный (вернее, не совсем точный) о_О
А как определён факториал нецелого числа?
(комментарий оставлен в рамках федеральной целевой программы "говорить классным людям, что они классные")
Эта статья, как и многие другие ваши статьи, восхитительно прекрасна. Пишите ещё, пожалуйста.
Sign up to leave a comment.
Пятничный JS: единственно верный способ вычисления факториала