Делайте локальные переменные
Так как мы занялись темой рекурсии, то вот правило, которое используется для того, чтобы еще сильнее сократить использование стека. Локальная переменная может быть объявлена статической (тем самым она минует стек), если ее значение не должно сохраняться после рекурсивного вызова. Вот один пример:
f()
{
static int i;
// ...
for( i = 10; --i = 0; )
// ...
f();
for( i = 10; --i = 0; ) // переменная i вновь инициализиру–
// ется
после рекурсивного вызова,
// поэтому она может быть статичес–
} // кой.
Вот другой:
int f()
{
static int depth = 0;
static int depth_max = 0;
++depth; depth_max = max( depth, depth_max );
if( depth 10 )
return -1; // уровень рекурсии слишком глубок.
f();
--depth;
return depth_max;
}
В этом последнем случае переменная depth
используется для передачи информации —
глубины рекурсии — от одного экземпляра подпрограммы другому, рекурсивному экземпляру этой же самой подпрограммы. Переменная depth_max
хранит след достигнутой максимальной глубины рекурсии. depth
вовсе не будет работать, если она должна будет сохранять свое значение после вызовов — весь смысл в том, что каждый рекурсивный вызов модифицирует эту переменную.