Re: Как закодировать?

From
Andrew Ezhguroff ()
To
Pavel P
Date
2002-10-10T12:23:39Z
Area
RU.ALGORITHMS
 <ao2fd4$dik$1@host.talk.ru> <ao2qp5$2a62$1@ddt.demos.su>
From: "Andrew Ezhguroff" <eandr@com2com.ru>

Привет! "Pavel P" <vprin@indiainfo.com>  сообщил(а):

 PP> Еще для организации циклов. А подавляющее большиство задач
 PP> к этому и сводиться: циклы, преобразования, обработка списков
 PP> и деревьев.

Понятно, что циклы и рекурсия взаимозаменяемы. Но я говорю о другом - о том,
что некоторые алгоритмы "прозрачнее" в рекурсивном виде, а некоторые - в
циклическом.

Но при этом "прозрачность" не гарантирует эффективность:

Классический пример (не уверен, что правильно разобрался с синтаксисом
языка) прозрачности при абсолютной неэффективности (во всяком случае при
реализации в лоб; или Haskell умеет хранить промежуточные результаты и
использовать их для оптимизации?):

Fib 0 = 1
Fib 1 = 1
Fib x = Fib (x-1) + Fib (x-2)

 PP> Си не всегда интерпретаторы то догоняет. Perl со строками
 PP> быстрее чем С работает в области регулярных выражений.

Программа, написанная на Си, работает с регулярными выражениями быстрее, чем
Си? Забавная шутка...

 PP> То что с предпоследного это понятно. Но статик ведет к тому
 PP> что при вызове этой функции из двух паралельных thread'ов
 PP> с большой вероятностью получишь не то что ждешь.

Но Си - не многопоточный язык (вероятно, к счастью - судя по тому, во что
превратили многозадачность в Аде). В этом отношении лямбда-языки скорее
всего имеют преимущество (во всяком случае Хоор для описания взаимодействия
процессов использовал Лисп).

Если нужен итерационный вариант для параллельных процессов, то

  static char  Buf[CHAR_BIT*sizeof(int)+1];
         char *Tmp = Buf+(sizeof(Buf)-1);

меняем на (появился явный '\0'):

  char  Buf[CHAR_BIT*sizeof(int)+1];
  char *Tmp = Buf+(sizeof(Buf)-1);
  *Tmp='\0';

, а

  return Tmp;

меняем (для gcc) на:

  return strdup(Tmp);

, либо (более стандартный вариант):

  return strcpy((new char[sizeof(Buf)-(Buf-Tmp)]), Tmp);

Разумеется, этот вариант несколько медленнее (хотя и не слишком). И память,
выделенную по strdup, или new, придется явно освобождать...

 >> Краткость - это только для ленивых.
 >> Прозрачность - это скорее для статей и учебников. В реальном
 >> программировании "прозрачность" в значительной степени обеспечивается
 >> комментариями (что автоматически снимает требование "краткости").
 PP> И то и другое незаменимо при поддержке и развитии большого
 PP> проекта.

Прозрачность - да. Хотя при выборе между прозрачностью и эффективностью,
скорее предпочтут эффективность. Но вот что касается краткости - не
согласен... Или ты не об этом,

 PP> Сортировка та же рекурсия, но конечная :)

Быстрая сортировка - да. Но ИМХО, большинство сортировок куда понятнее в
"циклическом", чем в рекурсивном варианте.

С уважением, Андрей.


-- 
Отправлено через сервер Форумы@mail.ru - http://talk.mail.ru
--- ifmail v.2.15dev5
 * Origin: Talk.Mail.Ru (2:5020/400)