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

How to create a loop to feed back the result as new param of the function? (PowerShell)

我当前的脚本是:

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

$OF = 100

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

现在结果是25。但是我想做的是给这个脚本添加一个循环。在循环中,结果 F (F $OF) 将作为函数的新 $OF 反馈。然后函数再次运行。直到结果-lt 2才会停止反馈结果。整个过程更像是优化:不断减小值,直到满足objective。但是,我不确定如何创建这样的循环。使用 FOR 循环?或者做直到循环?

几种方法可以做到这一点:

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

}



f -OF 200

-或

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)

你问题中的原始描述似乎指向一个 recursive method as a recursive function can run until a condition is met (in the same manner as a loop). In this case a simple while loop or do/while 循环可能会起作用,但这也提供了一个很好的机会来学习递归以解决以后的问题或分配(例如展平数组或 sorting/searching 问题)。

简单的递归方法

关于代码的注释:开始学习命名标准是一种很好的编码习惯。在这种情况下,在函数内创建的变量不应与其他函数同名(除非需要 $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
}

这个函数运行,打印current OFcur_of)的值,检查cur_of的值是否为大于 2. 比CalculateFcur_of/2调用自身(即简单的递归)。或者,如果不是,则完成该功能。

For 循环版本

由于@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测试以确保没有版本控制问题