1. C# / Говнокод #19371

    −1

    1. 1
    2. 2
    3. 3
    4. 4
    5. 5
    6. 6
    7. 7
    Func<int,int> fact = (int i_in) => i_in;
    
    fact = (int i_in) =>
    {
    	if (i_in>1) return (fact(i_in-1)*i_in);
    	else return (1);
    };

    Запостил: tucvbif, 29 Января 2016

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

    • Это какие-то олдфаги из 80-х пишут "пацанскую" рекурсию там, где можно сделать мемоизацию и цикл? Вот понадобится вычислять такую необходимую функцию миллиард раз в секунду, тут-то и сэкономим на вызовах.
      Ответить
      • Подозреваю, что автор гуглил "install F# bez sms", но опечатался, нсжсл на соседнюю кнопку.
        Ответить
        • Интересно, есть ли предел у оптимизации факториала? Что с ним еще можно сделать после мемоизации и превращения рекурсии в цикл?
          Ответить
          • Х....нуть табличку в регистры? Подменить в тексте программы на константы? (Скажем, посредством шаблонов C++, если все аргументы известны)

            Почти что эволюция хаскель-программиста, только тут:
            1. Школьник: for(var i=1; i<=n; i++) f *= i;
            2. Студент: с рекурсией как в этом ГК
            3. Выпускник: мемоизация
            4. Кандидат наук: флаги компилятора, ассемблер, регистры, ксор(?)
            5. Доктор наук: факториал на ПЛИС
            6. Академик РАН: for(var i=1; i<=n; ++i) f *= i;
            Ответить
            • Но ведь конпелятору уже давно всё известно, не?
              Ответить
            • Программист со стажем: просто вызывает функцию из ГМП
              Ответить
          • Попробуй посоревноваться с GMP на факториалах чисел порядка миллиона, увидишь :)
            Ответить
            • Там юзается что-то типа:
              10! = 1 * 2 * 3 * 4 * 5 * 6 * 7 * 8 * 9 * 10 = // разбиваем на чёт и нечёт
              (1 * 3 * 5 * 7 * 9) * 2^5 * (1 * 2 * 3 * 4 * 5) = // ещё раз
              (1 * 3 * 5 * 7 * 9) *  (1 * 3 * 5) * 2^7 * (1 * 2) = // и ещё раз
              (1 * 3 * 5 * 7 * 9) *  (1 * 3 * 5) * 2^8
              Заметим, что все эти скобки одинаково начинаются, что ещё сэкономит время (т.е. t1 = 1 * 3 * 5, t2 = t1 * 7 * 9, 10! = t1 * t2 * 2^8). Ну а все двойки добавляются в самом конце, тупо одним побитовым сдвигом.

              P.S. https://gmplib.org/manual/Factorial-Algorithm.html Оп-па, про вторую часть с prime sieving я не знал.
              Ответить
        • Нуачо — модно, стильно, молодёжно.
          Ответить
    • Barber: what you want
      Him: Let me get that factorial
      Barber: say no more
      Ответить

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