如何创建一个循环以将结果作为函数的新参数反馈? (电源外壳)
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 OF(cur_of
)的值,检查cur_of
的值是否为大于 2. 比CalculateF
用cur_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
测试以确保没有版本控制问题
我当前的脚本是:
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 OF(cur_of
)的值,检查cur_of
的值是否为大于 2. 比CalculateF
用cur_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
测试以确保没有版本控制问题