Соревнование:
Напишите программу или функцию, которая вводит положительное число и возвращает его факториал .
Примечание: это вопрос кодового троллинга . Пожалуйста, не воспринимайте вопрос и / или ответы всерьез. Больше информации здесь . Каждый вопрос о проверке кода также является вопросом о конкурсе популярности , поэтому побеждает ответ, получивший наибольшее количество голосов.
popularity-contest
code-trolling
alephalpha
источник
источник
Ответы:
Это очень простая численная вычислительная задача, которую мы можем решить с помощью приближения Стирлинга :
Как видите, эта формула имеет квадратный корень, который нам также понадобится приблизить. Для этого мы выберем так называемый «вавилонский метод» , потому что он, пожалуй, самый простой:
Обратите внимание, что вычисление квадратного корня таким способом является хорошим примером рекурсии.
Объединение всего этого в программе Python дает нам следующее решение вашей проблемы:
С простой модификацией вышеупомянутая программа может вывести аккуратную таблицу факториалов:
Этот метод должен быть достаточно точным для большинства приложений.
источник
C #
Извините, но я ненавижу рекурсивную функцию.
источник
Джава
источник
питон
Конечно, лучший способ решить любую проблему - использовать регулярные выражения:
источник
Haskell
Короткий код - эффективный код, поэтому попробуйте это.
Почему это троллинг:
Я бы посмеялся над любым программистом, который написал это ... Неэффективность прекрасна. Также, вероятно, непостижимо для любого программиста на Haskell, который на самом деле не может написать факториальную функцию.
Изменить: я опубликовал это некоторое время назад, но я думал, что буду разъяснять для будущих людей и людей, которые не могут читать на Haskell.
Код здесь берет список чисел от 1 до n, создает список всех перестановок этого списка и возвращает длину этого списка. На моей машине это занимает около 20 минут за 13! И тогда это должно занять четыре часа на 14! а потом два с половиной дня по 15 !. За исключением того, что в какой-то момент у вас заканчивается память.
Редактировать 2: На самом деле вам, вероятно, не хватит памяти из-за того, что это Хаскелл (см. Комментарий ниже). Возможно, вы сможете заставить его оценить список и каким-то образом сохранить его в памяти, но я недостаточно знаю об оптимизации (и неоптимизации) Haskell, чтобы точно знать, как это сделать.
источник
[1..n]
. - Одна конкретная перестановка[1..n]
, ограниченная громом для остальных перестановок (многочлен вn
). - Аккумулятор дляlength
функции.C #
Так как это математическая задача, имеет смысл использовать приложение, специально разработанное для решения математических задач, чтобы сделать этот расчет ...
Шаг 1:
Установите MATLAB. Я думаю, что пробная версия подойдет, но эта сверхсложная проблема, вероятно, достаточно важна, чтобы заслужить покупку полной версии приложения.
Шаг 2:
Включите компонент MATLAB COM в свое приложение.
Шаг 3:
источник
C #
Факториалы - это математическая операция более высокого уровня, которую сложно переварить за один раз. Лучшее решение в таких задачах программирования - разбить одну большую задачу на более мелкие.
Теперь н! определяется как 1 * 2 * ... * n, поэтому, по сути, повторное умножение, а умножение - не что иное, как повторное сложение. Итак, учитывая это, следующее решает эту проблему:
источник
Тролли:
z = n - 1 + 1
) - это самодокументирование, если вы знаете, что происходит.p[]
используя рекурсивный расчет коэффициентов серии!(Это приближение Ланцоша гамма-функции )
источник
- 1 + 1
? Мой компилятор оптимизирует его (это не число с плавающей запятой, где оптимизация кода может быть опасной), поэтому он кажется ненужным.double z = n - 1
является частью приближения гамма-функции. Это+ 1
из отношения, чтоgamma(n + 1) = n!
для целого числа n.Все мы знаем из колледжа, что наиболее эффективный способ вычисления умножения - это использование логарифмов. В конце концов, зачем людям использовать таблицы логарифмов в течение сотен лет?
Итак, из идентичности
a*b=e^(log(a)+log(b))
мы формируем следующий код Python:Он создает список чисел от
1
доx
(+1
необходим, потому что Python отстой) вычисляет логарифм каждого, суммирует числа, увеличивает ее до степени суммирования и, наконец, округляет значение до ближайшего целого числа (потому что Python отстой) , Python имеет встроенную функцию для вычисления факториалов, но он работает только для целых чисел, поэтому он не может производить большие числа (потому что Python отстой). Вот почему вышеупомянутая функция необходима.Кстати, общий совет для студентов заключается в том, что если что-то работает не так, как ожидалось, это, вероятно, потому, что язык отстой.
источник
К сожалению, в Javascript отсутствует встроенный способ вычисления факториала. Но, тем не менее, вы можете использовать его значение в комбинаторике, чтобы определить значение:
Факториал числа n - это число перестановок списка такого размера.
Таким образом, мы можем сгенерировать каждый список из n-значных чисел, проверить, является ли это перестановкой, и, если это так, увеличить счетчик:
Тролли:
O(n)
, нетO(n!)
, ноO(n^n)
. Одного этого было бы достаточно для квалификации здесь.number.toString(base)
, но это не работает для баз выше 36. Да, я знаю 36! это много , но все же ...Math.pow
? Нет? Ну что ж.++
вне цикла for делает его еще более загадочным. Также,==
это плохо.$i
.new Array
,document.write
(с друзьями) иalert
(вместо строки или метки ввода) образуют полный тройной выигрыш грехов выбора функции. Почему ввод добавляется динамически в конце концов?=
делают их еще труднее для чтения.источник
Руби и Вольфрам Альфа
Это решение использует REST API WolframAlpha для вычисления факториала, с RestClient для получения решения и Nokogiri для его анализа. Он не изобретает никаких колес и использует хорошо проверенные и популярные технологии, чтобы получить результат самым современным способом.
источник
Javascript
Javascript - это функциональный язык программирования, это означает, что вы должны использовать функции для всего, потому что это быстрее.
источник
r = -~(function(){})
наверняка решит это.Использование Bogo-Sort в Java
Это на самом деле работает, только очень медленно, и это не точно для больших чисел.
источник
PERL
Факториал может быть сложной проблемой. Техника сопоставления / уменьшения - как и в Google - может разделить математику, отбросив кучу процессов и собрав результаты. Это позволит эффективно использовать все эти ядра или процессоры вашей системы в холодную зимнюю ночь.
Сохраните как f.perl и chmod 755, чтобы убедиться, что вы можете запустить его. У вас уже есть «Патологически эклектичный мусорный список», не так ли?
Тролли:
источник
ARGV[0]
на самом деле первый аргумент, а не сценарий!$ARGV[0]
потому, что у большинства языков, которые я немного знаю, они естьпитон
Просто O (n! * N ^ 2) алгоритм, чтобы найти факториал. Базовый случай обработан. Нет переполнения.
источник
Ну, в Golfscript есть простое решение. Вы можете использовать интерпретатор Golfscript и запустить этот код:
Полегче да :) Удачи!
источник
!
Mathematica
Кажется, это не работает для чисел больше 11, и факториал [11] заморозил мой компьютер.
источник
Рубин
Самый медленный однострочник, который я могу себе представить. Для расчета на процессоре i7 требуется 2 минуты
6!
.источник
Правильный подход к этим сложным математическим задачам - DSL. Так что я буду моделировать это с точки зрения простого языка
Чтобы хорошо написать наш DSL, полезно рассматривать его как свободную монаду, сгенерированную алгебраическим функтором.
Мы могли бы написать это в Haskell как
Я оставлю это читателю, чтобы получить тривиальную реализацию
Теперь мы можем описать операцию для моделирования факториала в этом DSL
Теперь, когда мы смоделировали это, нам просто нужно предоставить фактическую функцию интерпретации для нашей свободной монады.
И я оставлю остальную часть обозначения читателю.
Чтобы улучшить читабельность, иногда полезно представить конкретный AST в форме
а затем прямо тривиальное отражение
и тогда просто рекурсивно оценить AST.
источник
питон
Ниже приведена версия решения на Python, которая не ограничивается 32-разрядным (или 64-разрядным в самой современной системе) пределом для целых чисел в Python. Чтобы обойти это ограничение, мы будем использовать строку в качестве входных и выходных данных дляfactorial
подпрограммы и внутренне разбивать строку на ее цифры, чтобы иметь возможность выполнять умножение.Итак, вот код:
getDigits
функция разбивает строку, представляющую число, на его цифры, поэтому «1234» становится[ 4, 3, 2, 1 ]
(обратный порядок только упрощает функцииincrease
иmultiply
).increase
Функция принимает такой список есть и увеличивает его на единицу. Как следует из названия,multiply
функция умножается, например,multiply([2, 1], [3])
возвращает,[ 6, 3 ]
потому что 12 умножить на 3 равно 36. Это работает так же, как если бы вы умножали что-то ручкой и бумагой.Затем, наконец,
factorial
функция использует эти вспомогательные функции для вычисления фактического факториала, например,factorial("9")
дает в"362880"
качестве своего вывода.Примечания
В Python целое число не имеет ограничения, поэтому, если вы хотите сделать это вручную, вы можете просто сделать
Там также очень удобная
math.factorial(n)
функция.Это решение, очевидно, намного сложнее, чем должно быть, но оно действительно работает, и фактически оно иллюстрирует, как вы можете вычислить факториал в случае, если вы ограничены 32 или 64 битами. Поэтому, хотя никто не поверит, что это решение, которое вы придумали для этой простой (по крайней мере, в Python) проблемы, на самом деле вы можете чему-то научиться.
источник
питон
Наиболее разумным решением является проверка всех чисел до тех пор, пока вы не найдете тот, который является факториалом данного числа.
источник
Самое элегантное рекурсивное решение в C
Каждый знает, что самые элегантные решения для факториалов рекурсивны.
Факториал:
Но умножение также можно определить рекурсивно как последовательные добавления.
Умножение:
И то же самое можно добавить в качестве последовательных приращений.
Дополнение:
В
C
, мы можем использовать++x
и--x
для обработки примитивов(x + 1)
и,(x - 1)
соответственно, поэтому у нас все определено.Давайте попробуем это:
Идеально, хотя 8! потребовалось много времени по какой-то причине. Ну что ж, самые элегантные решения не всегда самые быстрые. Давай продолжим:
Хм, я дам вам знать, когда он вернется ...
источник
питон
Как указывалось в ответе @ Matt_Sieker, факториалы можно разбить на части, поэтому суть задач - это суть программирования. Но мы можем разбить это на 1!
Я думаю, что этот код гарантирует SO Error, потому что
Рекурсия - согревает
Каждый слой генерирует призывы к умножению
который генерирует звонки на addnumbers
который генерирует звонки на addby1!
Слишком много функций, верно?
источник
Просто зайдите в Google и введите свой факториал:
http://lmgtfy.com/?q=5!
источник
TI-Basic 84
Это реально работает :)
источник
Javascript
Очевидно, что задача программиста - выполнять как можно меньше работы и использовать как можно больше библиотек. Таким образом, мы хотим импортировать JQuery и math.js . Теперь задача проста, как это:
источник
питон
С небольшой модификацией стандартной рекурсивной факторной реализации она становится невыносимо медленной при n> 10.
источник
удар
источник
Попробуем сделать это методом Монте-Карло . Все мы знаем, что вероятность того, что две случайные n- перестановки будут равны, в точности равна 1 / n! , Поэтому мы можем просто проверить, сколько тестов нужно (давайте назовем это число b ), пока мы не получим c хитов. Тогда н! ~ б / с .
Мудрец, должен работать и в Python
источник
удар
Факториалы легко определить с помощью хорошо известных инструментов командной строки от bash.
Как упомянул @Aaron Davies в комментариях, это выглядит намного опрятнее, и мы все хотим красивую и опрятную программу, не так ли?
источник
paste
команду:seq 1 $n | paste -sd\* | bc
paste
выглядит как обычное английское слово, и его легко запомнить. Мы действительно этого хотим? ; о)