Комментарии 18
n/(n-1)/(n-2).../(1) = n/((n-1)*(n-2)*...*(1)) = n/(n-1)! = (n*n)/(n*(n-1)!) = n2/n!
q = q > 1 ? q /= n : q *= n
— WAT?Вот что получится, если в факториале не умножать, а делить.
Я думаю что делить надо так:
1 / n / (n-1) / (n-2) / ... / 1 = 1 / n!
Я почти минусанул этот пост. Ну ё-моё, домножить числитель и знаменатель на n и делать из этого открытие — это за гранью добра и зла.
Все вполне очевидно.
Вот мой любимый алгоритм для вычисления факториалов
Не учитывается 0!
давайте изменим это определение и преобразуем единственное вхождение * в /, оставив всё остальное неизменным (за исключением названия функции).
Вот почему программистов иногда так хают, что слов нет. Не умеет чел в математику, а пытается оптимизировать хвостовую рекурсию. Операция деления не является коммутативной, поэтому он закодил вычисление n/((n-1)/((n-2)/((...1)))...). При этом ошибку свою он таки не осознал!
А вообще, если в факториале делить, получится 1/n!, потому что вычислять-то надо с единицы. По определению, факториал натурального числа N есть произведение чисел от 1 до N, т.е. писать надо 1*2*3*...*N. И если делить вот здесь, мы получим 1/2/3/.../N == 1/(N!)
...
Хотя — надо было читать всё, а не скроллить до кода сразу. Всё тут есть, и i^2/N! и некоммутативность деления. Остается только нетерпеливость комментатора и триггер-фраза в середине текста. ОК, уели.
Операция деления не является коммутативной
Если строго, все опреации с плавающей точкой не коммутативны. Обычно это не важно, но в некоторых случае может проявляться. Например, когда первый аргумент — почти ноль, а второй — очень большой. Также ошибка может накапливаться.
По определению, факториал натурального числа N есть произведение чисел от 1 до N
А вообще факториал — всего лишь частный случай гамма-функции :)
n! = Γ(n + 1)
Не умеет чел в математику, а пытается оптимизировать хвостовую рекурсию. Операция деления не является коммутативной,
Операция деления не является ассоциативной :)
Вот тут примерно то же самое, но с программистом. Человек написал n!!/(n-1)!!! и удивился появлению степеней двоек.
Чисто на полях. Из интересного.
Мне больше нравятся праймориалы, а еще больше.... М-м-м. Пусть будут бейсориалы. Это произведения всех простых в степенях 2^k, потому что из них можно собрать битовую матрицу, когда каждое базовое число входит в произведение только один раз (без дополнительных степеней). Ну и их еще можно записывать в показательной форме. Все базовые числа получаются как 1B19 например. Не без проблем все это, конечно, потому что нужны индексы по последовательным степеням p и вообще кластерный индекс по последовательным числам.
Делимые факториалы