首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何将双重递归方法转换为循环?

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

Stack Overflow用户
提问于 2013-01-15 17:37:26
回答 2查看 590关注 0票数 18

这是我的简化的双递归方法。它没有做任何有用的事情,但演示了所需的递归调用:

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);
    }   
}

我不太明白如何将此代码编写为循环,以查看性能是否有所提高。

我已经纠正了这个例子中明显的错误。

EN

回答 2

Stack Overflow用户

发布于 2013-01-16 18:02:22

任何可以递归完成的工作都可以使用堆栈来完成。假设您只需要在示例中编写的功能:

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);
        }
    }
}

它输出与递归代码相同的内容:

125
155
155
215
215
245
245
335
335
365
365
425
425
455
455
票数 4
EN

Stack Overflow用户

发布于 2013-01-16 18:43:32

如果你只想使用最终结果,我可以给你这个代码

protected void TestIt(int i1, int i2, int v)
{
    int tot = 0;
    for (; v > 0; v--)
        tot = tot * 2 + 30;
    Console.Out.WriteLine(tot + i1 + i2);
}

如果你需要中间结果,不幸的是这段代码不能提供给你。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14334744

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档