#теория
Почитал я оглавление от книги 'Введение в рекурсивное программирование' Но так и не понял что такое рекурсивное программирование. Кроме того что это чуть меньше кода // рекурсивная функция 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 см. Эта проверка (в данном случае на размер куска) является выходом из рекурсии и является обязательной, в противном случае функция будет вызывать себя "бесконечно".
Комментариев нет:
Отправить комментарий