Рекурсивные подпрограммы

Язык Perl допускает, чтобы подпрограмма вызывала саму себя. Подпрограмма, вызывающая сама себя, называется рекурсивной. При написании, рекурсивных подпрограмм следует иметь в виду, что все переменные, значения которых изменяются внутри подпрограммы, должны быть локальными, то есть объявленными при помощи функции my( ) или local( ). В этом случае при каждом вызове подпрограммы создается новая копия переменной, что позволяет избежать неопределенности и замещения текущего значения переменной ее значением из следующего вызова подпрограммы.
Рекурсивные подпрограммы следует применять осторожно. Многие алгоритмы, являющиеся по сути итеративными, можно реализовать при помощи рекурсивной подпрограммы, но такая подпрограмма окажется неэффективной по времени выполнения и потребляемым ресурсам памяти. Вместе с тем, существуют задачи, решить которые можно только при помощи рекурсивных алгоритмов. В этом случае применение рекурсивных подпрограмм является не только вполне оправданным, но и необходимым. Одной из таких задач, которую операционная система решает постоянно, является рекурсивный просмотр дерева каталогов. Рассмотрим пример рекурсивной Perl-подпрограммы tree( ), которая делает то же самое: просматривает дерево каталогов, начиная с каталога, заданного (листинг 9.10).
Листинг 9.10. Рекурсивный просмотр дерева каталогов
sub tree {
  local (*ROOT); 
  my ($root) = $_[0];
  opendir ROOT, $root;
  my (@filelist) = readdir ROOT;
  closedir ROOT;
  for $x (@filelist) {
    if ($х ne "." and $x ne "..") { 
      $x = $root."/".$x; 
      print " $x\n" if (-f $x); 
      if (-d $x) {
        print "$x:\n";
        tree($x);
      }
    }
  }
}
Здесь использованы встроенные подпрограммы Perl opendir( ), closedir( ), readdir( ), применяемые соответственно для открытия каталога, закрытия каталога и чтения его содержимого. Подпрограмма tree( ), рекурсивно просматривая каталог, переданный ей в качестве параметра, выводит имена вложенных подкаталогов и содержащихся в них файлов.

Следующая страница Содержание главы





Нет комментариев.



Оставить комментарий:
Ваше Имя:
Email:
Антибот: *  
Ваш комментарий: