我写了这个递归方法,但问题是我需要对循环做同样的事情。 第一个是递归的,第二个是循环,但它不好。有关如何修复循环方法的任何建议吗?
double SR(int n)
{
if (n > 1)
return Math.Sqrt(2 + SR(n - 1));
else
return Math.Sqrt(2);
}//recursion
double SR2(double n)
{
if(n > 1)
{
do
{
n = Math.Sqrt(2+Math.Sqrt(n - 1));
}
while(n <= 1);
}
else
{
n = Math.Sqrt(2);
}
return n; //loop
}
答案 0 :(得分:3)
double SRloop(int n)
{
var r = Math.Sqrt(2);
for (var i = 2; i <= n; i++)
{
r = Math.Sqrt(2 + r);
}
return r;
}
答案 1 :(得分:2)
解释Knaģis回答:
您需要掌握更多递归函数的概念。
通常,递归函数具有“基数”或“停止”条件的概念,即,当满足指定条件时函数返回的“固定”值,否则,它将无限期地继续。
转换为循环时,基本条件成为循环的起始值。 因此在循环版本中,Math.Sqrt(2)成为n的起始值。
从那里,我们循环直到达到所需的值。如何确定何时停止?在原始递归函数中,停止条件是“n <= 1”(注意,它是达到“else”的条件,因此它是你的if的倒数)。此外,在每次迭代中,函数接收“n - 1”作为参数。那么正在发生的事情是我们将n递减1,直到它达到1;所以循环将被执行(n - 1)次。为了更清楚这一点,可以用for (var i = 0; i < (n-1); i++)
重写循环。效果是相同的,并且更清楚的是循环执行(n-1)次。
另外,请查看this link以获取更多信息。