Algorithm 如何在堆栈溢出之前评估递归调用的最大数量

Algorithm 如何在堆栈溢出之前评估递归调用的最大数量,algorithm,recursion,Algorithm,Recursion,让我们以递归函数为例,例如阶乘。我们还假设有一个1 MB大小的堆栈。使用笔和纸,如何在堆栈溢出之前估计对函数的递归调用数?我对任何特定的语言都不感兴趣,而是对抽象的方法感兴趣 有一些问题看起来很相似,但大多数问题都与特定语言有关,或者扩展堆栈大小,或者通过运行特定函数来估计堆栈大小,或者防止溢出。我想找到一个数学方法来估计它 我在一个算法挑战中发现了类似的问题,但却找不出任何合理的解决方案 非常感谢您的任何建议 编辑 对于提供的回放,如果语言真的不能从等式中去掉,那么让我们假设它是C#。此外,由

让我们以递归函数为例,例如阶乘。我们还假设有一个1 MB大小的堆栈。使用笔和纸,如何在堆栈溢出之前估计对函数的递归调用数?我对任何特定的语言都不感兴趣,而是对抽象的方法感兴趣

有一些问题看起来很相似,但大多数问题都与特定语言有关,或者扩展堆栈大小,或者通过运行特定函数来估计堆栈大小,或者防止溢出。我想找到一个数学方法来估计它

我在一个算法挑战中发现了类似的问题,但却找不出任何合理的解决方案

非常感谢您的任何建议

编辑

对于提供的回放,如果语言真的不能从等式中去掉,那么让我们假设它是C#。此外,由于我们将简单int或long传递给函数,因此它不是通过引用传递的,而是作为副本传递的。另外,假设一个简单的实现,没有散列,没有多线程,一个尽可能类似于函数数学表示的实现:

    private static long Factorial(long n)
    {
        if (n < 0)
        {
            throw new ArgumentException("Negative numbers not supported");
        }

        switch (n)
        {
            case 0:
                return 1;
            case 1:
                return 1;
            default:
                return n * Factorial(n - 1);
        }
    }
私有静态长阶乘(长n)
{
if(n<0)
{
抛出新ArgumentException(“不支持负数”);
}
开关(n)
{
案例0:
返回1;
案例1:
返回1;
违约:
返回n*阶乘(n-1);
}
}

这在很大程度上取决于功能的实现。函数在再次调用自身之前使用了多少内存。当它递归100次时,内存中还有100个函数作用域,包括函数参数和变量。它还在堆栈上保留100个位置来存储返回值


我不认为语言可以轻易地从等式中去掉,因为您需要确切地知道堆栈是如何使用的。例如,对象是通过引用传递的吗?或者对象是作为堆栈上的新实例复制的?

堆栈大小/函数帧大小(即堆栈上与每个函数调用对应的空间量)。后者取决于课程语言/实施。我添加了一些编辑,以澄清评论和回放中出现的问题。