如何将双重递归方法转换为循环?

des*_*scf 18 c# algorithm recursion for-loop

这是我简化的双重递归方法.它没有任何用处,但说明了所需的递归调用:

void Main()
{
    Test(2, 3, 4);
}

int n1 = 0;
int n2 = 0;

void Test(int i1, int i2, int v)
{
    if (v == 0)
    {
        (n1 + n2).Dump();
    }
    else
    {
        n1 = i1 + 10;
        n2 = i2 + 20;
        Test(n1, n2, v - 1);
        Test(n2, n1, v - 1);
    }   
}
Run Code Online (Sandbox Code Playgroud)

我无法想象如何将其作为一个循环来编写,看看性能是否有所改善.

我已经纠正了明显错误的例子.

Far*_*hin 4

任何可以递归完成的事情也可以使用堆栈完成。假设您只需要示例中编写的功能:

i1和i2最终将被添加到全局变量n1、n2的和中。您可以对它们求和并将结果分配给代码开头的 n1 或 n2 以简化功能。使用堆栈,您可以执行以下操作:

int n1 = 0;
int n2 = 0;

void Test2(int i1, int i2, int v)
{
    Stack<int> s = new Stack<int>(new[] {v});
    n1 = i1 + i2;

    while (s.Any())
    {
        v = s.Pop();
        if (v == 0)
        {
            Console.Out.WriteLine(n1 + n2);
        }
        else
        {
            int tmp = n1;
            n1 = n2 + 10;
            n2 = tmp + 20;
            s.Push(v - 1);
            s.Push(v - 1);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

其输出与递归代码相同:

125
155
155
215
215
245
245
335
335
365
365
425
425
455
455
Run Code Online (Sandbox Code Playgroud)