Previous Page  10 / 18 Next Page
Information
Show Menu
Previous Page 10 / 18 Next Page
Page Background

Полное факториальное моделирование равномерных последовательностей…

ISSN 0236-3933. Вестник МГТУ им. Н.Э. Баумана. Сер. Приборостроение. 2017. № 5

141

//------------------------------------------------------------

static public int FreeValue(int[] q, int n, int z)

{ for (int k = 1; k <= n; k++)

{ int j = 0;

for (; j <= z; j++)

if (q[j] == k) break;

if (j > z) return k;

}

return 0;

}

//------------------------------------------------------------

static public int NextFreeValue(int[] q, int n, int z)

{ int v = q[z] + 1; // возможное значение

if (v > n) return 0; // увеличение невозможно

for (; v <= n; v++) // область возможных значений

{ int j = 0; // начало проверки

for (; j < z; j++) // элементы до z-позиции

if (q[j] == v) break; // значение не принято

if (j >= z) break; // ранее значения v не было

}

if (v > n) v = 0;

return v; // следующее свободное значение

}

//------------------------------------------------------------

static public int ProcessUp(int[] q, int n)

{ int z = n - 2; // предпоследняя z-позиция

while (true)

{ int nv = NextFreeValue(q, n, z);

if (nv != 0) // смещение z влево не требуется

{ q[z] = nv; // следующее свободное число

while (++z < n) // z-позиции до конца

q[z] = FreeValue(q, n, z - 1);

return z;

}

if (z == 0) break; // последовательности нет

z--; // z-позиция слева

}

return 0; // следующей последовательности нет

}

}

}

Функция

NextFreeValue()

определяет следующее свободное число для

позиции

z

. Это число должно быть минимальным и не совпадать ни с одним

числом, находящимся в позициях до позиции

z

. Если такое число найти нельзя,

то формируется отказ. Функция

FreeValue()

определяет минимальное число,

которое должно находиться справа от позиции

z

. Функция

ProcessUP()

по-

следовательно манипулирует функциями

NextFreeValue()

и

FreeValue()

,

получая в итоге новую последовательность, которая непосредственно должна

следовать за исходной последовательностью.

После выполнения программы

P010301

на мониторе появляется следующий

листинг, который здесь приведен с сокращениями (на месте опущенных строк

стоит прочерк):

r = 1 q = 1 2 3 4 5 6 7

r = 2 q = 1 2 3 4 5 7 6