Привет всем.
Предположим перед Вами сложный цикл, нужно понять что он делает, находите ли Вы инвариантные отношения, которые выполняются в каждой интерации цикла, с целью применить эти инвариантные отношения ко всей области значений, которые принимают переменные в результате полного выполнения цикла?
Объясню описанный выше вопрос на примере:
Код:
/* example from "The Practice of Programming" *
* by Brian W. Kernighan and Rob Pike */
void swap(int v[], int i, int j)
{
int tmp;
tmp = v[i];
v[i] = v[j];
v[j] = tmp;
}
void quicksort(int v[], int n)
{
int i, last;
if ( n <= 1 )
return;
swap(v, 0, rand() % n);
last = 0;
for ( i = 1; i < n; i++ )
if (v[i] < v[0])
swap(v, ++last, i);
swap(v, 0, last);
quicksort(v, last);
quicksort(v + last + 1, n - last - 1);
}
У меня всегда были проблемы в понимании работы подобных циклов, когда описывают последовательным образом (шаг за шагом), что они делают.Единственное
понимание которое я нашёл
адекватным это не представление в динамике, того что происходит при выполнении цикла,
а статичная картина, то есть следующие инвариантные отношения при выполнении цикла:
И принимая во внимание строчку
Код:
swap(v, 0, last);
получаем:
Вопрос в том, используете ли Вы на практике такой метод понимания того, что делает сложный цикл?
Если нет (хотя я пока не вижу других альтернатив понимания), то какими методами Вы понимаете что делает сложный цикл?