如何创建一个循环来反馈结果作为函数的新参数? (电源外壳)

时间:2015-06-29 02:04:56

标签: powershell powershell-v2.0

我目前的脚本是:

function F
{
     param ([int]$OF)
     $OF / 2
}

$OF = 100

if ((F $OF) -ge 2)
{
     F (F $OF)
}

现在结果是25。但我想要做的是为这个脚本添加一个循环。在循环内,结果F (F $OF)将作为函数的新$OF反馈。然后该功能再次运行。在结果为-lt 2之前,它不会停止反馈结果。整个过程更像是优化:在达到目标之前不断降低价值。但是,我不知道如何创建这样的循环。使用FOR LOOP?或者直到停止?

2 个答案:

答案 0 :(得分:2)

有两种方法可以做到这一点:

function F
{
 param ([int]$OF)
 do 
 {
    $result = $of / 2
    $of = $result
    $result
 }
 while( $result -gt 2)

}



f -OF 200

-OR

function F2
{
   param ([int]$OF)

   $of / 2
}

#Declare the parameter value
$val = 100


do
{
  $result = F2 -OF $val
  $val = $result
  $result
}
while($result -gt 2)

答案 1 :(得分:1)

您的问题中的原始描述似乎指向recursive method,因为递归函数可以运行,直到满足条件(与以下相同:一个循环)。在这种情况下,简单的while loopdo/while循环可能会起作用,但这也提供了一个很好的机会来了解后续问题或赋值的递归(例如展平数组或排序/搜索问题)。

简单递归方法

关于代码的说明:开始学习命名标准是很好的编码实践。在这种情况下,在函数中创建的变量不应该与其他函数具有相同的名称(除非需要$global)并且一个字母函数很少是个好主意 - 这两者都可能导致混淆并使代码难以后来解析。

function CalculateF #changed from F
{
     param ([int] $cur_of) #changed from $OF so no confusion with calling variable

     $cur_of

     if ($cur_of -gt 2)
     {
        CalculateF -cur_of ($cur_of/2) # calls itself with halved value
     }
}

$OF = 100

if (CalculateF -cur_of $OF -ge 2) #changed these function calls to call the parameter directly
{
     CalculateF -cur_of $OF
}

此函数运行,打印当前OF cur_of)的值,检查cur_of的值是否大于 2.使用CalculateFcur_of/2调用自身(即简单的递归)。或者,如果不是,它完成了功能。

For Loop Version

由于@Kiran已经放置了带有do / while循环和函数的版本 - 我将把for loop版本放在一个函数根本不需要或有意义的情况下。因为for循环可以对迭代器执行简单的数学计算,而不仅仅是+/- 1,因此:

$val = 100

for ($i=$val; $i -ge 2; $i /= 2)
{
  # Sets iterator to value and loops through (dividing by 2 each time)
  [int] $i
}

注意 :使用powershell -version 2 ./scriptname.ps1在上面进行测试,以确保没有版本控制问题