История изменений
Исправление Stanson, (текущая версия) :
Сочетания на перлятине, чисто proof of concept. Так, вообще, это подправленный вариант реализации динамического количества вложенных циклов - V[0], V[1], V[2]... - это индексы вложенных циклов, количество вложений задаётся переменной $depth. Нужно было перебрать все возможные сочетания красителей для расчёта рецептур.
#!/usr/bin/perl
$depth = 3;
$max = 6;
@v = ();
for( $vt = 1, $i = 1; $i <= $depth; $i++ ) { $vt = $vt * ( $max - $i + 1 ) / $i; }
printf( "Number of %d-combinations from %d: %d\n", $depth, $max, $vt );
# only N-combinations
for( $i = 0; $i < $depth; $i++ ) { $v[$i] = $i; }
# 1 ... N - combinations
#for( $i = 0; $i < $depth; $i++ ) { $v[$i] = 0; }
for( $vc = 0; ; $vc++ )
{
print "C" . $vc . ":\t". join( " ", @v ) ."\n";
for( $l = $max, $d = $depth - 1; $d >= 0; $d--, $l-- )
{
if( ++$v[$d] < $l ) { last; }
}
if( $d < 0 ) { last; }
$l = $max - ( $depth - 1 - ++$d );
for( ; $d < $depth ; $d++, $l++ )
{
if( $v[$d] >= $l ) { $v[$d] = $v[$d-1] + 1; }
}
}
$max - количество элементов, из которых надо строить сочетания.
$depth - количество элементов в сочетании.
В сочетании могут быть только разные элементы. сочетания типа 2 3 4 и 4 3 2 считаются одинаковыми.
Пример выдаст такое:
Number of 3-combinations from 6: 20
C0: 0 1 2
C1: 0 1 3
C2: 0 1 4
C3: 0 1 5
C4: 0 2 3
C5: 0 2 4
C6: 0 2 5
C7: 0 3 4
C8: 0 3 5
C9: 0 4 5
C10: 1 2 3
C11: 1 2 4
C12: 1 2 5
C13: 1 3 4
C14: 1 3 5
C15: 1 4 5
C16: 2 3 4
C17: 2 3 5
C18: 2 4 5
C19: 3 4 5
Исходная версия Stanson, :
Сочетания на перлятине, чисто proof of concept. Так, вообще, это подправленный вариант реализации динамического количества вложенных циклов - V[0], V[1], V[2]... - это индексы вложенных циклов, количество вложений задаётся переменной $depth. Нужно было перебрать все возможные сочетания красителей для расчёта рецептур.
#!/usr/bin/perl
$depth = 3;
$max = 6;
@v = ();
for( $vt = 1, $i = 1; $i <= $depth; $i++ ) { $vt = $vt * ( $max - $i + 1 ) / $i; }
printf( "Number of %d-combinations from %d: %d\n", $depth, $max, $vt );
# only N-combinations
for( $i = 0; $i < $depth; $i++ ) { $v[$i] = $i; }
# 1 ... N - combinations
#for( $i = 0; $i < $depth; $i++ ) { $v[$i] = $i; }
for( $vc = 0; ; $vc++ )
{
print "C" . $vc . ":\t". join( " ", @v ) ."\n";
for( $l = $max, $d = $depth - 1; $d >= 0; $d--, $l-- )
{
if( ++$v[$d] < $l ) { last; }
}
if( $d < 0 ) { last; }
$l = $max - ( $depth - 1 - ++$d );
for( ; $d < $depth ; $d++, $l++ )
{
if( $v[$d] >= $l ) { $v[$d] = $v[$d-1] + 1; }
}
}
$max - количество элементов, из которых надо строить сочетания.
$depth - количество элементов в сочетании.
В сочетании могут быть только разные элементы. сочетания типа 2 3 4 и 4 3 2 считаются одинаковыми.
Пример выдаст такое:
Number of 3-combinations from 6: 20
C0: 0 1 2
C1: 0 1 3
C2: 0 1 4
C3: 0 1 5
C4: 0 2 3
C5: 0 2 4
C6: 0 2 5
C7: 0 3 4
C8: 0 3 5
C9: 0 4 5
C10: 1 2 3
C11: 1 2 4
C12: 1 2 5
C13: 1 3 4
C14: 1 3 5
C15: 1 4 5
C16: 2 3 4
C17: 2 3 5
C18: 2 4 5
C19: 3 4 5