C#递归方法转换为循环

时间:2013-11-30 21:06:01

标签: c#

我写了这个递归方法,但问题是我需要对循环做同样的事情。 第一个是递归的,第二个是循环,但它不好。有关如何修复循环方法的任何建议吗?

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
}

2 个答案:

答案 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以获取更多信息。