打印出该功能时,它仅打印出3和5的整数,但不打印出15的整数。
function Print-Numbers-Weird ([int]$count) {
for ($i=1; $i -le $count; $i++) {
$isdivisibleby3 = $i % 3 -eq 0
$isdivisibleby5 = $i % 5 -eq 0
$isdivisibleby15 = $i % 15 -eq 0
if ($isdivisibleby3) {
Write-Host $i "- divisibleby3"
} elseif ($isdivisibleby5) {
Write-Host $i "- divisibleby5"
} elseif ($isdivisibleby15) {
Write-Host $i "- divisibleby15"
} else {
Write-Host $i
}
}
}
答案 0 :(得分:1)
Ansgar Wiechers在评论中提供了关键指针:
可以除以
15
的数字也可以除以3
,因此您的代码永远不会到达$isdivisibleby15
子句,因为$isdivisibleby3
子句首先匹配。
Olaf指出您的问题是"FizzBuzz" job-interview question的PowerShell化身,而UnhandledExcepSean指出首先进行$isdivisibleby15
测试 解决您的问题。
要以 PowerShell-idiomatic 的方式解决问题,请使用switch
statement:
function Get-WeirdNumbers ([int] $count) {
switch (1..$count) {
{ $_ % 3 -eq 0 } { "$_ - divisibleby3" }
{ $_ % 5 -eq 0 } { "$_ - divisibleby5" }
{ $_ % 15 -eq 0 } { "$_ - divisibleby15" }
default { $_ }
}
}
上述解决方案评估 all 个条件(除了default
分支仅在其他不匹配的情况下才执行)。这将向您显示某些数字如何匹配倍次,即被 3和5整除的数字,这意味着它们也是也是被15整除。
专门解决“ FizzBuzz”问题(将Fizz
整除的数字打印3
,将Buzz
整除的数字5
打印, 或 FizzBuzz
表示可被 3
和5
整除的数字,以及所有其他数字,例如打印每个输入数字一个表示形式):
必须安排分支以在15个 first 之前进行可除性测试。
其余分支的处理必须跳过。
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
循环的另一种解决方案,该循环再次使用可以匹配多个 的条件,并结合 string concatenation 来实现预期的结果:
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 }
}
}
答案 1 :(得分:0)
这是您可以与if/elseif
1..100 | %{
$x = $_
if($x %15 -eq 0)
{
Write-Host "fizzbuzz"
}elseif($x %3 -eq 0)
{
Write-Host "fizz"
}elseif($x %5 -eq 0)
{
Write-Host "buzz"
}
else
{
Write-Host $x
}
}
不过,mklement0的解释绝对正确。