Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Vtoraya_chast_uchebnika_po_WWW_Okonchat_variant...doc
Скачиваний:
31
Добавлен:
27.09.2019
Размер:
6.06 Mб
Скачать

4.7. Рекурсивное использование функций

4.7.1. Рекурсивные и итеративные функции – в чём разница, недостатки и преимущества

Как и во многих других языках программирования, в PHP поддерживаются рекурсивные функции – точнее механизм, обеспечивающий реализацию такого синтаксиса.

Под рекурсивной функцией понимают функцию, которая содержит в своём определении вызов самой себя. То есть, содержит в своём описании ссылку на своё же имя.

Эти функции особенно полезны (то есть с ними удобнее запрограммировать соответствующие задачи) для перемещения по динамическим структурам данных, таким как связные списки и деревья.

Во многих случаях рекурсия может использоваться вместо итерации, поскольку оба эти подхода позволяют повторно выполнять те или иные действия.

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

кроме последнего этапа, потому что он предоставляет конечный результат.

Данный термин употребляется в математике, экономике, программировании, психологии и психиатрии. Применение данного термина в различных областях носит несколько различный характер, но смысл остается в рамках общепринятого значения.

В программировании итерация — это организация обработки данных, при которой действия повторяются многократно, не приводя при этом к вызовам самих себя. По этому признаку итерацию легко отличить от рекурсии.

Когда какое-то действие необходимо повторить большое количество раз, в программировании используются циклы. Например, нужно вывести 200 раз на экран текст «Привет, Мир». Вместо 200-кратного повторения одной и той же команды вывода текста часто создается цикл, который прокручивается 200 раз, и 200 раз выполняет то, что написано в теле цикла. Один шаг цикла и называется итерацией.

Из вышеприведённого определения следует, что итеративными называются функции, реализующие итеративный алгоритм вычисления какой-либо величины или выполнения какого-либо действия.

Однако лишь немногие Web-приложения требуют сложных структур данных, для которых удобнее применять рекурсивные функции. Поэтому рекурсия используется очень редко. Кроме того, рекурсивные функции работают медленнее и используют больший объем памяти, чем итерация, поэтому всегда, по возможности, следует отдавать предпочтение итерации. Тем не менее, ознакомиться с организацией работы таких функций необходимо.

Рассмотрим Пример 4-23, приведенный ниже. В первой части примера описана итеративная функция reverse_i($stroka), а во второй – рекурсивная reverse_r($stroka). Видно, что внутри (то есть в определении) рекурсивной функции имеется обращение функции к самой себе (смотри подчёркнутую строку примера).

Обе функции делают одно и то же – обращают заданную в качестве аргумента строку. Обратить заданную строку – означает записать её, расположив составляющие её символы в обратном порядке.

Вы уже увидели (или догадались), что, скорее всего, в PHP уже есть функция, используя которую можно облегчить решение этой задачи. Действительно, есть – это функция substr(). Она возвращает часть строки.

Ниже приводятся описание её синтаксиса и пример её использования.

Описание работы функции substr()

Синтаксис функции:

string substr(string string, int start[, int length])

Эта функция возвращает часть строки. Первый аргумент – исходная строка; второй – положение символа в строке, с которого надо возвращать строку. При этом считается, что первый символ в строке имеет номер, равный нулю (отсчёт начинается с нуля), а третий – длина строки в символах, которую надо вернуть. Если третий аргумент не указан, то возвращается вся оставшаяся часть строки, начинающаяся с указанного символа.

Например:

<?

$string = substr("Hello, world!", 6, 2);

echo ($string);

?>

Результат выполнения – символ " w". Заметьте, перед символом "w" стоит символ пробел " ".

Если же третий параметр не указывать, т.е. написать:

$string = substr("Hello, world!", 6);,

то возвратиться подстрока " world!".

Если параметр start отрицателен, то строка будет начинаться с позиции start, отсчитываемой с конца строки. При этом отсчёт начинается с -1, то есть, последний символ строки имеет при таком порядке номер = -1.

Если используется параметр length и он положителен, то функция substr() вернёт, по крайней мере, length символов, начиная с позиции start. Если параметр start превышает длину строки, то функция вернёт FALSE.

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