递归C++函数栈溢出错误

递归C++函数栈溢出错误,c++,C++,count的值超过4800后,此函数会溢出堆栈。有人知道如何解决此问题吗?不要使用递归-使用常规循环。每次调用f方法时,都会占用堆栈上的几个字,并且会在某个点溢出 通常,有办法根据您的系统和/或编译器来增加堆栈大小,但我不建议这样做,特别是因为当count的值大于4800时,它会再次溢出 或者只要int f{return 5000;}就可以了。我假设这是一个学习递归的学术练习。如果不是,请不要为此使用递归 编写函数的更好方法: #include<iostream> using nam

count的值超过4800后,此函数会溢出堆栈。有人知道如何解决此问题吗?

不要使用递归-使用常规循环。每次调用f方法时,都会占用堆栈上的几个字,并且会在某个点溢出

通常,有办法根据您的系统和/或编译器来增加堆栈大小,但我不建议这样做,特别是因为当count的值大于4800时,它会再次溢出


或者只要int f{return 5000;}就可以了。

我假设这是一个学习递归的学术练习。如果不是,请不要为此使用递归

编写函数的更好方法:

#include<iostream>
using namespace std;
int f()
{
    static int count=0;
    count++;
    if (count>=5000)
        return count;
    return f();
}
int main ()
{
    cout<<f();
    return 0;
}

这仍然会比在循环中返回常量或递增消耗更多的运行时资源,如果将所需常量增加到一个更大的数字,则需要增加堆栈大小。

如果希望递归运行,可以关闭调试模式,然后,当VisualStudio在堆栈上添加额外的内容以检测是否对堆栈进行了破坏时,您将获得成功[这是如何说变量x周围的堆栈被覆盖,或者不管确切的消息是什么]

然而,依赖于能够递归地进行大量调用通常是一个糟糕的计划——在某个时刻,它仍然会失败。这是5000、50000还是500000只是这个函数占用多少堆栈空间的问题。我要说的是,任何没有100级递归的自然限制的情况都是以错误的方式解决问题。如果你有这么大的递归级别,最好使用一个软件栈,例如:C++中的STD::堆栈,并保存该堆栈上的CRORY状态,并使用函数内的软件恢复它。p> 堆栈空间不足是最糟糕的运行时问题之一,因为实际上您无能为力—您可以执行一些操作来打印错误消息或类似的消息,但实际上无法为流程提供更多的堆栈空间并继续。当一个进程内存不足或类似的情况下,你可以说Ok,我不会分配它,然后给用户一条漂亮的错误消息说‘我不能这样做’,然后很好地保存当前状态并退出,例如


[是的,您可以增加应用程序的堆栈大小,但这真的只能作为真正的最后手段,并且只有在您完全理解为什么需要如此大的堆栈时才能做到——如果您需要更大的堆栈,您通常会做错事]

这很明显,但使用更大的堆栈。如何实现这一点取决于编译器/linker.int f{…return f;},递归是有限的。每个深度级别都需要一点堆栈,而后者不是无底的。是否启用优化?用return 5000替换整个函数?或者将值初始化为4999。//伙计们,我想使用递归。我想要一种增加堆栈大小的方法,请告诉我这取决于你的编译器,因为你必须告诉编译器增加程序的堆栈。
#include <iostream>

int f(int i)
{
    if (i >= 5000)
    {
        return i;
    }
    else
    {
        return f(i + 1);
    }
}

int f_alt1()
{
    return 5000;
}

int f_alt2()
{
    int i = 0;
    for (; i <= 5000; ++i);
    return i;
}

int main()
{
    std::cout << f(0) << std::endl;
    return 0;
}