1. C++ / Говнокод #913

    +1122.2

    1. 1
    2. 2
    3. 3
    4. 4
    5. 5
    6. 6
    7. 7
    int SUM(int A, int B)
    {
    	if (0 == A) return B;
    	if (0 == B) return A;
    
    	return (1 + (SUM(A, B - 1) + SUM(A - 1, B)) / 2);
    }

    рекурсивное вычисление суммы двух чисел.

    Запостил: guest, 21 Апреля 2009

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

    • показать все, что скрытоЗначит очень надо было, если так написали.

      При коммерческом программировании иногда, кстати, специально оставляют места в программах, которые потом можно на халяву оптимизить.
      Ответить
    • показать все, что скрытоГовнюк:
      ничего говнокодерского здесь нет. ты бы еще предложил за место if case использовать
      Ответить
    • Ja!:
      мутанты.
      особенно сравнение с 0 порадовало :)
      Ответить
    • amx:
      Граждане комментаторы, да вы ёбнулись.

      Если это не олимпиадная задача, то написавшему такое надо сделать что-то крайне нехорошее.
      Ответить
    • valyala:
      Что-то этот код больше на Си похож, чем на С++. Лучше использовать вот такой код:

      #include <cstdio>
      
      template <int A, int B>
      class S : virtual public S<A - 1, B>, virtual public S<A, B - 1>
      {
      protected:
        int s;
      
      public:
        explicit S() : S<A - 1, B>(), S<A, B - 1>()
        {
          s = 1 + (S<A - 1, B>::s + S<A, B - 1>::s) / 2;
        }
      
        virtual int f()
        {
          return s;
        }
      };
      
      template <int A>
      class S<A, -2>
      {
      protected:
        static const int s = A - 2;
      };
      
      template <int B>
      struct S<-3, B>
      {
      protected:
        static const int s = B - 3;
      };
      
      int main()
      {
        // schitaem 6 + 5
        S<1, 1> *bs;
        S<6, 5> s;
        bs = &s;
        int s1 = bs->f();
      
        // schitaem 3 + 4
        S<3, 4> ss = s;
        int s2 = dynamic_cast<S<3, 1> *>(&0[&ss])->f();
      
        printf("s1=%d, s2=%d\n", s1, s2);
        return 0;
      }
      Ответить
      • Жаль, что нет профессии "обфускатор" ;)

        P.S.: Кстати говоря, программа компилилась аж целых 7 секунд о_0

        xaionaro@bellatrix:~$ time g++ t.cpp
        real 0m7.041s
        user 0m6.624s
        sys 0m0.260s
        xaionaro@bellatrix:~$ ./a.out
        s1=11, s2=7
        Ответить
    • Отрицательные значения не умеет считать...
      Ответить
      • Вполне вероятно, что именно для этого и писалось.
        Ответить
    • anmiles:
      старинное программерское развлечение "дважды два в тыщу строк"? :-)
      Ответить
    • показать все, что скрытоГовнюк:
      Да вы долбаебы-говнокодеры! идите в переучивайтесь. никуя ведь не знаете, может задача спецефическая
      код вполне годный.

      кто больший говнокодер? тот кто наклал 7 строк или тот кто наклал аж 50 строк и при том это говно так же работает
      Ответить
    • Евгений:
      Хороший код. Создан просто для того, чтобы попрактиковаться в рекурсивных методах. Суммирует только неотрицательные числа. :) 5+
      Ответить
    • TT:
      Хотелось бы услышать комментарии К.О...
      Ответить
    • К.О.:
      Хороший код, красивый.
      Ответить
    • сиськи
      Ответить
    • показать все, что скрытоbugmenot:
      Думаю, это просто высосанный из пальца пример рекурсии.
      Дебильный пример, такое же исполнение, но знание рекурсии показывает.
      Ответить
    • сразу видно бакланов которые SICP не читали
      Ответить
    • мне плохо стало, особенно после комментария номер 5 :D
      Ответить
    • анонимус:
      Это очень похоже на то, что писалось в
      Structure and Interpretation of Computer Programs aka SISP. Вобщем, это ЛИСП'овский прикол.
      Ответить
    • Этот код может иметь смысл на неких процессорах (или вымышленных виртуальных машинах), в структуре команд которых есть только команда инкремента на единицу и нет команды суммирования. Бред, думаете? Почитайте о первых советских процессорах, узнаете много нового.
      Ответить
      • почему тогда не
        return A == 0 ? B : SUM(A-1, B)+1

        ?
        Ответить
      • там sum + sum нифига не инкременты на единицу, полноценное сложение присутствует
        Ответить
    • int sum(int a, int b)
      {
      return (b)? sum(++a, --b): a;
      }
      Ответить
    • p4tr3g:
      while(a>0){a--;b++;}return b;
      Ответить
    • Между прочим, давече был на собеседовании и мне дали вот это, только на псевдоязыке, прокомментировать. Так что такой код нужен :)
      Ответить
    • Прикольная головоломка, можно переделать вот так:

      int SUM(int A)
      {
      	if (0 == A) return 0;
      
      	return ( 1 + ( SUM(A-1) ) / 1 );
      }


      Или:

      int SUM(int A, int B, int C)
      {
      	if (0 == A) return B+C;
      	if (0 == B) return C+A;
      	if (0 == C) return A+B;
      
      	return ( 1 + ( SUM(A-1, B, C) + SUM(A, B-1, C) + SUM(A, B, C-1) ) / 3 );
      }


      Общий случай сами ищите если кому нужно.
      Ответить
    • сумма в стиле функционального программирования
      Ответить
      • петросян в рубке
        Ответить
        • Чо ж Петросян-то?
          Всякие арифметики Пеано и кольца Гротендика вполне себе используются для вычислений на типах в Haskell'ах и обычных — в Coq'ах.
          Ответить
    • SUM(1, 1) /* вернет единицу */
      Ответить
    • Ъ:

      int tilde(int a, int b) {
      	return b + 1;
      }
      int inc(int a, int b) {
      	if (a == 0) return b;
      	if (b == 0) return a;
      	return tilde(a, inc(a, b - 1));
      }


      tilde — некая арифметическая операция, увеличивающее число на единицу.
      Ответить
      • Ну и нафига передавать в tilde два параметра?
        Ответить
    • Определение суммы почти с точки зрения математического определения натуральных чисел и операций над ними. Правда, деление пополам не в тему.
      Ответить
    • отличная приколюха. коментаторы, говорящие, что автор долбоёб, судя по всему сами долбоёбы и чувства юмора не имеют
      Ответить
      • Чувства юмора нет, но вы держитесь. Хорошего вам настроения!
        Ответить
        • показать все, что скрытоСтоит отметить, что, если ехать в секс-тур по Камеруну, то языкового барьера между мною и тамошними шоколадными зайцами не возникнет, ибо говорят там по-английски; а уж я с мало-мальским знанием английского языка завсегда смогу прокричать "Deeper, deeper!", верно?
          Ответить
    • SICP напомнило
      (define (+ a b)
         (if (= a 0)
             b
             (inc (+ (dec a) b))))
      Ответить
    • Какой багор )))
      Ответить
      • Стоит отметить, что, если ехать в секс-тур по Камеруну, то языкового барьера между мною и тамошними шоколадными зайцами не возникнет, ибо говорят там по-английски; а уж я с мало-мальским знанием английского языка завсегда смогу прокричать "Deeper, deeper!", верно?
        Ответить

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