Ansgar Wiechers предоставил критический указатель в комментарии:
Числа, которые можно разделить на 15
, также можно разделить на 3
, поэтому ваш кодникогда не достигает предложения $isdivisibleby15
, потому что предложение $isdivisibleby3
соответствует первому.
Олаф указывает на то, что ваш вопрос касается воплощения PowerShell «FizzBuzz» на собеседовании по поводу работы и UnhandledExcepSean балловчто выполнение теста $isdivisibleby15
сначала решает вашу проблему.
Чтобы решить вашу проблему с помощью PowerShell-idiomatic , используйте switch
.оператор :
function Get-WeirdNumbers ([int] $count) {
switch (1..$count) {
{ $_ % 3 -eq 0 } { "$_ - divisibleby3" }
{ $_ % 5 -eq 0 } { "$_ - divisibleby5" }
{ $_ % 15 -eq 0 } { "$_ - divisibleby15" }
default { $_ }
}
}
Приведенное выше решение оценивает все условия (за исключением того, что ветвь default
выполняется только в том случае, если больше ничего не соответствует ).Это покажет вам, как определенные числа соответствуют кратным разам, а именно тем, которые делятся на и 3 и 5, что означает, что они также делятся на 15.
Специально для решения проблемы "FizzBuzz" (выведите Fizz
для чисел, кратных 3
, Buzz
для чисел, кратных 5
, или FizzBuzz
для чисел, кратных и 3
и 5
, и всем остальным числам как самим, т. Е. Выведите одно представление для каждого входного числа):
Ветви должны быть расположены таким образом, чтобы проверять делимость на 15 сначала .
Обработка остальных ветвей должна быть пропущено , как только совпадение найдено.
function Get-FizzBuzz ([int] $count) {
switch (1..$count) {
{ $_ % 15 -eq 0 } { "FizzBuzz"; continue }
{ $_ % 5 -eq 0 } { "Buzz"; continue }
{ $_ % 3 -eq 0 } { "Fizz"; continue }
default { $_ }
}
}
Обратите внимание, как continue
используется для пропуска обработки оставшихся ветвей.Хотя break
также доступен, он будет пропускать обработку любых оставшихся входных чисел, учитывая, что вход представляет собой массив чисел.
Вот альтернативное решение, основанное наЦикл foreach
, в котором снова используются условия, для которых может соответствовать более 10 * * в сочетании с конкатенацией строк для достижения желаемого результата:
function Get-FizzBuzz ([int] $count) {
foreach ($num in 1..$count) {
$output = ''
if ($num % 5 -eq 0) { $output = 'Fizz' }
if ($num % 3 -eq 0) { $output += 'Buzz' }
# Output the result
if ($output) { $output } else { $num }
}
}