LINUX.ORG.RU

История изменений

Исправление 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