1. Pascal / Говнокод #22438

    −17

    1. 1
    2. 2
    3. 3
    4. 4
    5. 5
    6. 6
    7. 7
    8. 8
    function mux(a,b:integer):integer;
    begin
     if a=1 then mux:=b
     else if (a=0) or (b=0) then mux:=0
     else if (a<0) and (b<0) then  mux:= mux(-b-1, -a) - a
     else
      mux:= mux(b-1, a) + a;
    end;

    Лабораторная работа. Умножение чисел.

    Запостил: untitled_001, 24 Февраля 2017

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

    • Эвонокак по хитрому умножение через сумму реализовали
      Ответить
    • 0*Infinity = NaN. Код говно. Говнокод.
      Ответить
    • Важное умение, которое должны помочь обрести лабораторные работы - покрытие всех возможных вариантов.

      a и b образуют двумерное пространство. Сначала оттуда вырезали a=1, затем - a=0 or b=0, затем a<0 and b<0. Пространство немного уменьшилось. В итоге остались варианты a<0 and b>0 и a>1 and b<>0, для которых применяется формула mux:= mux(b-1, a) + a. Чему равно mux(-1, 10)?
      Ответить
      • mux(-1, 10) = -10 я гарантирую это ©
        Ответить
      • Заметим, что a*b = a*(b-1+1) = a*(b-1) + a верно для любых чисел, в том числе и отрицательных. На каждой итерации одно из чисел уменьшается на 1. Т.е. если хотя бы одно из них положительно - оно занулится и рекурсия остановится.

        З.Ы. Строку 3, походу, можно выбросить.
        Ответить
        • Упростил код, проверь: http://ideone.com/1cW8UP
          Ответить
          • Ну и хвостовая рекурсия, чтобы стек не жрать: http://ideone.com/s1yIaZ
            Ответить
          • спОсибо за годный рефакторинг. такое чувство, когда дядя Вирт остался недопонятым и это спрогрессировало
            Ответить
          • Ошибся, следует читать как mux(10, -1).
            Ответить
            • Ну хватит уже перебирать варианты... Выше написано, почему код работает для любых чисел (ну ок, если нет переполнений).

              Если лень думать - держи тест: http://ideone.com/KLS66y
              Ответить
              • Я не перебираю, я демонстрирую случай, когда одно из чисел отрицательно.
                Не осознал, что (а) a и b меняются местами, (b) из-за этого они постоянно крутятся, из-за чего положительное раз в две итерации уменьшается и рано или поздно становится нулём.
                Код - не из очевидных, я бы переписал.
                Ответить
                • > Код - не из очевидных
                  Согласен. Я сначала тоже думал, что он забагован.
                  Ответить
    • > mux
      Где здесь мультиплексор, untitled_001?
      Ответить
      • это умукуснажение же
        Ответить
      • на той же полке, где здравый смысл и библиотечный абонемент, думается...
        Ответить
        • Приобрел абонемент в очко твоей мамаши, проверь.
          Ответить
          • проверил. увидел золотушного онаниста. проверь и не благодари
            Ответить
    • >>mux
      Какой еще нахуй мух?)))

      Кстати по сабжу - классическое умножение на числах Пеано
      Ответить
      • Я бы определил через https://ru.wikipedia.org/wiki/Гипероператор
        Ответить

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