C# 我写了一封信;阿克曼“;函数在VisualStudio中运行。堆栈溢出发生得非常快

C# 我写了一封信;阿克曼“;函数在VisualStudio中运行。堆栈溢出发生得非常快,c#,recursion,visual-studio-2017,ackermann,C#,Recursion,Visual Studio 2017,Ackermann,我在youtube上看了这个视频,觉得用C语言复制这个函数会很有趣# 我运行了它,在21次呼叫后,大约一秒钟,它停止了。这家伙在视频中的程序显然已经运行了大约4周,现在仍在运行 static int ack(int m, int n) { int answer; if (m == 0) answer = n + 1; else if (n == 0) answer = ack(m - 1, 1); else answer = ack(m - 1, ack(m, n

我在youtube上看了这个视频,觉得用C语言复制这个函数会很有趣#

我运行了它,在21次呼叫后,大约一秒钟,它停止了。这家伙在视频中的程序显然已经运行了大约4周,现在仍在运行

static int ack(int m, int n)
{
    int answer;
    if (m == 0) answer = n + 1;
    else if (n == 0) answer = ack(m - 1, 1);
    else answer = ack(m - 1, ack(m, n - 1));
    return answer;
}
static void Main(string[] args)
{
    for (int i = 0; i < 6; i++)
        for (int j = 0; j < 6; j++)
            Console.WriteLine($"ackerman ({i},{j}) is:{ack(i, j)}");
    Console.ReadLine();
}
static int ack(int m,int n)
{
int答案;
如果(m==0)答案=n+1;
如果(n==0)回答=ack(m-1,1),则为else;
else-answer=ack(m-1,ack(m,n-1));
返回答案;
}
静态void Main(字符串[]参数)
{
对于(int i=0;i<6;i++)
对于(int j=0;j<6;j++)
WriteLine($“ackerman({i},{j})是:{ack(i,j)}”);
Console.ReadLine();
}
我能做些什么让我的跑步时间更长吗


编辑:我将“调试”更改为“发布”,并获得了一次迭代和几秒钟。

跟踪给定参数的已计算值,并返回缓存值,而不是反复计算它。

您使用的语言与它们相同吗?除非你的语言有“优化递归”,否则你不会有一个连续递归程序运行超过几秒钟。我相信他们是用C写的。如果C或C支持TCO,我可以尝试自己用C.IDK重写它。现在我再看一遍代码,我甚至不知道它是否符合TCO。这不是一个非常C友好的函数。C#是一种托管语言,具有自动内存管理功能;在整个递归树被处理之前,这个函数的每个实例都可能在内存中,而对于这么大的一棵树,在所有实例都被解析之前,您的内存基本上已经用完了。事实上,视频的要点是,最终,即使是最强大的计算机也会分段故障(堆栈溢出)具有此功能。