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

时间:2014-11-18 23:19:49

标签: algorithm recursion

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

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

我在算法挑战中发现了类似的问题,但无法提出任何合理的解决方案。

任何建议都受到高度赞赏。

修改

如果语言确实无法从等式中取出,那么为了回应所提供的重播,我们假设它是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);
        }
    }

1 个答案:

答案 0 :(得分:1)

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

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