1. JavaScript / Говнокод #15715

    +160

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    var a = [1,2,3,4,5,6,7,8,9];
    document.write('1' + '!='+ a[0] + '<br>');
    document.write('2' +'!=' + a[0] * a[1] + '<br>');
    document.write('3' +'!=' + a[0] * a[1] * a[2] + '<br>');
    document.write('4' +'!=' + a[0] * a[1] * a[2] * a[3] + '<br>');
    document.write('5' +'!=' + a[0] * a[1] * a[2] * a[3] * a[4] + '<br>');
    document.write('6' +'!=' + a[0] * a[1] * a[2] * a[3] * a[4] * a[5] + '<br>');
    document.write('7' +'!=' + a[0] * a[1] * a[2] * a[3] * a[4] * a[5] * a[6] + '<br>');
    document.write('8' +'!=' + a[0] * a[1] * a[2] * a[3] * a[4] * a[5] * a[6] * a[7] + '<br>');
    document.write('9' +'!=' + a[0] * a[1] * a[2] * a[3] * a[4] * a[5] * a[6] * a[7] * a[8] + '<br>');

    Таблица факториалов до 9

    Запостил: spellproff, 09 Апреля 2014

    Комментарии (17) RSS

    • "1!=1", "2!=2" - врет и не краснеет!
      Ответить
    • Когда скорость важнее ;D
      Ответить
      • Скорость важнее... Ну ок...
        1!=1<br>2!=2<br>3!=6<br>4!=24<br>5!=120<br>6!=720<br>7!=5040<br>8!=40320<br>9!=362880<br>
        Ответить
      • Есть в какой-нибудь иде такая фича, как в экселе - чтоб скажем строки 00-04 написать, и растянуть на 05-10? Если нет считайте что я запатентовал.
        Ответить
    • Самый правильный способ посчитать факториал выглядит примерно так:
      function pi(x){
          var r = Math.sqrt(2*Math.PI*x)*Math.pow((x/Math.E),x)*(1+20/(239*x));
          return (x == (x|0)) ? Math.round(r) : r;
      }

      Бонусом идёт расширение вообще на все числа >0.Кроме него самого
      Ответить
      • Но оно же приближённое... При 10 уже косяк.
        Ответить
        • >При 10 уже косяк.
          Дык не хуже чем у автора, у него тоже только до 9 считает.

          Для любителей отрицательной области определения
          function piZ(x){
              var M=Math, mpx=M.PI*x, r;
              return (x==0) ? 1
                   : (x <0) ? mpx / ( piZ(M.abs(x)) * M.sin(mpx) )
                   : ( r = M.sqrt (2*mpx) * M.pow((x/M.E), x) * (1 + 20/(239*x))
                       , (x == (x|0)) ? M.round(r) : r
                     );
          }
          Ответить
        • Зато оно асимптотическое!!!
          Теперь на отрицательных честные бесконечности, а не плавающие питухи.
          function piZ(x){
              var M=Math, mpx=M.PI*x, r,isInt=(x == (x|0));
              return (x==0) ? 1
                   : (x <0) ? isInt ? Infinity * (2*(x&1)-1) : mpx / ( piZ(M.abs(x)) * M.sin(mpx) )
                   : ( r = M.sqrt (2*mpx) * M.pow((x/M.E), x) * (1 + 20/(239*x))
                       , isInt ? M.round(r) : r
                     );
          }

          Кстати я тут вывел эмпирическим путём охуенный однострочник факториала для всех действительных, но даже сам не до конца понимаю почему получается такое точное приближение.
          Ответить
          • Формулу в студию.
            Ответить
            • Красивее, последних монстров, правда рекурсивное. Любители асимптотически хороших алгоритмов вроде Тараса будут недовольны.
              var f=function(n){
                  return n<0 ? f(++n)/(n) : n>=2?f(n-1)*n:2*Math.pow(2,n-1)-n;
              }

              PS> Прошлое было "асимптотическим" в обоих смыслах, и по сложности, и по уменьшению погрешности на пути в бесконечность.
              Ответить
              • Пресвятая толстота... Ну тогда можно Math.exp(Math.log(f(n-1)) + Math.log(n)) вместо f(n-1)*n.
                Ответить
                • >Пресвятая толстота...
                  Всмысле? Не надо мыслить дискретно.
                  Оно дробные очень точно считает.

                  >Math.exp(Math.log(f(n-1)) + Math.log(n))
                  Зачем?
                  Там выделенная часть не просто так, в ней вся соль.
                  Я сначала пробовал Math.pow(2,n-1), но потом заметил что разница между n! и Math.pow(2,n-1) практически такая же как между Math.pow(2,n-1) и n.
                  Ответить
                  • > Оно дробные очень точно считает.
                    А сравнивал с гамма-функцией?
                    Ответить
                    • Ну да, точнее с пи-функцией. Вот те монстры практически она и есть, я только еще пару членов ряда добавил.

                      Я искал короткую и простую формулу, которая на диапазоне (желательно [1;2]) практически равна ей.
                      Оказалось оно очень похоже на участке [0;2], что вообще замечательно, а дальше дело техники.

                      Не знаю, может можно и точнее.
                      Ответить

    Добавить комментарий