当打印出函数时,它只打印被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
}
}
}
发布于 2019-02-05 04:53:02
Ansgar Wiechers在一条评论中提供了关键的指针:
可以被15
整除的
数也可以被
3
整除,因此您的代码永远不会到达$isdivisibleby15
子句,因为$isdivisibleby3
子句首先匹配。
Olaf指出您的问题是"FizzBuzz" job-interview question的PowerShell化身,而UnhandledExcepSean指出首先执行$isdivisibleby15
测试可以解决您的问题。
要以PowerShell惯用的方式解决问题,请使用switch
statement
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“问题(为可被3
整除的数字打印Fizz
,为可被5
整除的数字打印Buzz
,为可被3
和5
整除的数字打印或 FizzBuzz
,以及所有其他数字本身-即,为每个输入数字打印一个表示):
找到匹配项后,必须将分支安排为按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
循环的另一种解决方案,该循环再次使用多个条件可以匹配的条件,并结合字符串连接来实现所需的结果:
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 }
}
}
发布于 2019-02-05 07:45:11
这是一个可以与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的解释是绝对正确的。
https://stackoverflow.com/questions/54523011
复制