PowerShell else如果不阅读最后一个功能

时间:2019-02-04 19:25:28

标签: powershell

打印出该功能时,它仅打印出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
        }
    }
}

2 个答案:

答案 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整除。


专门解决“ FizzBu​​zz”问题(将Fizz整除的数字打印3,将Buzz整除的数字5打印, FizzBuzz表示可被 35整除的数字,以及所有其他数字,例如打印每个输入数字一个表示形式):

  • 必须安排分支以在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的解释绝对正确。