Как бы я переписал эту петлю подбрасывания монеты - PullRequest
1 голос
/ 16 июня 2020

У меня есть вопрос, который меня немного озадачивает

У меня есть небольшой скрипт, который выдает результаты подбрасывания 4 монет

foreach  ($a in (0,1)){
    Foreach ($b in (0,1)){
        Foreach ($c in (0,1)){
            Foreach ($d in (0,1)){
                Write-host $a," ",$b," "$c, " ", $d
                }
            }
        }
    }

Как я могу переписать это, чтобы вы вводили количество монет для использования? т.е. 20

Ответы [ 2 ]

2 голосов
/ 16 июня 2020

Вы можете сгенерировать их следующим образом:

# Set number of coins
$n = 4

# Generate the initial sets (of flips) we want to calculate the product of 
$sets = ,@(0,1)*$n

# Start out with the list only containing the initial set of coinflips
$list,$rest = $sets

foreach($set in $rest){
    # For every remaining set of coinflips, add to each of the existing string of flip sequences
    $list = foreach($item in $list){
        $set |ForEach-Object {$item,$_-join ' '}
    }
}

# Now contains all the combinations
$list

Это будет работать для любого количества койнфлипов больше двух, но будьте осторожны, с 20 монетами это 2^20, iow. более миллиона последовательностей переворачивания

1 голос
/ 16 июня 2020

Это хороший кандидат для определения рекурсивной функции:

function Flip-Coins {

    Param(
        $Number,
        $result = @()
    )

    foreach  ($a in (0,1)) {
        if ($Number -eq 1) {
            Write-Host ($result + $a)
        } else {
            Flip-Coins -Number ($Number-1) -result ($result + $a)
        }
    }
}

Flip-Coins -Number 8

Вывод:

0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 1
0 0 0 0 0 0 1 0
0 0 0 0 0 0 1 1
0 0 0 0 0 1 0 0
0 0 0 0 0 1 0 1
0 0 0 0 0 1 1 0
0 0 0 0 0 1 1 1
0 0 0 0 1 0 0 0
0 0 0 0 1 0 0 1
0 0 0 0 1 0 1 0
0 0 0 0 1 0 1 1
0 0 0 0 1 1 0 0
0 0 0 0 1 1 0 1
0 0 0 0 1 1 1 0
0 0 0 0 1 1 1 1
...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...