#теория
Почитал я оглавление от книги 'Введение в рекурсивное программирование'
Но так и не понял что такое рекурсивное программирование.
Кроме того что это чуть меньше кода
// рекурсивная функция
int sum_first_natyrals(int n)
{
if(n==1)
return 1;
else
return sum_first_natyrals(n-1) + n;
}
И чуть больше сложности.
// не рекурсивная функция
int sum_first_natyrals(int n)
{
int s_f_n =0;
if(n==1)
return 1;
else
for (int i = n; i <0; i--)
s_f_n += i;
return s_f_n;
}
Также помню что на собеседованиях этому методу программирования уделяют внимание.
Учитывая что по сути вызов функции (не единичный, а частый ) лично по мне уже представляться
как "рекурсия". Либо это маркетинговый ход типа "масла масленого" либо как я видел
на крекерах надпись : "подходит для употребления с хумусом и моцарелой". Намного маркетинговей
звучит, в отличие от такого более точного написания : "подходит для употребления с
гороховой кашей и сыром".
Ответы
Ответ 1
Некоторые алгоритмы запрограммированные рекурсивно в самом деле будут более изящны, нежели их итеративные аналоги. А вот на практике к рекурсивным реализациям стоит подходить осторожно (и вовсе не из-за стека), поскольку такие программы обычно сложнее изменять при появлении новых требований к обрабатываемым данным. Точнее, заранее надо тщательно планировать, как возможные изменения во внешних данных можно будет "протянуть" через внутренние структуры, используемые рекурсивными функциями. Особенно при наступлении аварийных случаев где-то внутри рекурсивных вызовов.Ответ 2
Рекурсивное программирование — это программирование с использованием рекурсий. Рекурсия (в программировании) — это использование функций (методов), которые для выполнения заданной задачи ссылаются на самих себя. Пример. Нужно раздробить глыбу льда для прохладительных напитков на куски не более 1,5 см. Решение с помощью рекурсии: $желательный_размер_льда = 1.5см; @итоговые_куски_льда = (); функция дробить_лёд ($кусок_льда) { если ($кусок_льда <= $желательный_размер_льда) то { поместить $кусок_льда в @итоговые_куски_льда; выходим; } @куски_льда = выполнить_колотый_удар(кусок_льда); для каждого ($кусок из @куски_льда) { если ($кусок > $желательный_размер_льда) то { дробить_лёд($кусок); } иначе { поместить $кусок_льда в @итоговые_куски_льда; } } } Т.е. сначала мы применяем действие дробить_лёд к целой глыбе, потом к кускам поменьше, потом к их собственным кускам и так до тех пор, пока не получим куски размером не более 1,5 см. Эта проверка (в данном случае на размер куска) является выходом из рекурсии и является обязательной, в противном случае функция будет вызывать себя "бесконечно".
Комментариев нет:
Отправить комментарий