|
ru.algorithms- RU.ALGORITHMS ---------------------------------------------------------------- From : Andrew Ezhguroff 2:5020/400 10 Oct 2002 12:23:39 To : Pavel P Subject : Re: Как закодировать? -------------------------------------------------------------------------------- Привет! "Pavel P" <vprin@indiainfo.com> сообщил(а): PP> Еще для организации циклов. А подавляющее большиство задач PP> к этому и сводиться: циклы, преобразования, обработка списков PP> и деревьев. Понятно, что циклы и рекурсия взаимозаменяемы. Hо я говорю о другом - о том, что некоторые алгоритмы "прозрачнее" в рекурсивном виде, а некоторые - в циклическом. Hо при этом "прозрачность" не гарантирует эффективность: Классический пример (не уверен, что правильно разобрался с синтаксисом языка) прозрачности при абсолютной неэффективности (во всяком случае при реализации в лоб; или Haskell умеет хранить промежуточные результаты и использовать их для оптимизации?): Fib 0 = 1 Fib 1 = 1 Fib x = Fib (x-1) + Fib (x-2) PP> Си не всегда интерпретаторы то догоняет. Perl со строками PP> быстрее чем С работает в области регулярных выражений. Программа, написанная на Си, работает с регулярными выражениями быстрее, чем Си? Забавная шутка... PP> То что с предпоследного это понятно. Hо статик ведет к тому PP> что при вызове этой функции из двух паралельных thread'ов PP> с большой вероятностью получишь не то что ждешь. Hо Си - не многопоточный язык (вероятно, к счастью - судя по тому, во что превратили многозадачность в Аде). В этом отношении лямбда-языки скорее всего имеют преимущество (во всяком случае Хоор для описания взаимодействия процессов использовал Лисп). Если нужен итерационный вариант для параллельных процессов, то 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> проекта. Прозрачность - да. Хотя при выборе между прозрачностью и эффективностью, скорее предпочтут эффективность. Hо вот что касается краткости - не согласен... Или ты не об этом, PP> Сортировка та же рекурсия, но конечная :) Быстрая сортировка - да. Hо ИМХО, большинство сортировок куда понятнее в "циклическом", чем в рекурсивном варианте. С уважением, Андрей. -- Отправлено через сервер Форумы@mail.ru - http://talk.mail.ru --- ifmail v.2.15dev5 * Origin: Talk.Mail.Ru (2:5020/400) Вернуться к списку тем, сортированных по: возрастание даты уменьшение даты тема автор
Архивное /ru.algorithms/6488ca862ecc.html, оценка из 5, голосов 10
|