Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/159.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 为什么这个递归函数仍然会导致堆栈溢出?_C++_Recursion_Stack Overflow - Fatal编程技术网

C++ 为什么这个递归函数仍然会导致堆栈溢出?

C++ 为什么这个递归函数仍然会导致堆栈溢出?,c++,recursion,stack-overflow,C++,Recursion,Stack Overflow,为什么这个递归函数仍然会导致堆栈溢出 void DrawSierpinskiTriangle(const Point2f& left, const Point2f& top, const Point2f& right) { if (right.x - left.x <= 100) { return; } DrawTriangle(left, top, right); SetColor(0, 1, 0);

为什么这个递归函数仍然会导致堆栈溢出

void DrawSierpinskiTriangle(const Point2f& left, const Point2f& top, const Point2f& right)
{

    if (right.x - left.x <= 100)
    {
        return;
    }

    DrawTriangle(left, top, right);

    SetColor(0, 1, 0);
    DrawSierpinskiTriangle(Point2f{ right.x / 4.f,top.y / 2.f }, top, Point2f{ right.x / 4.f * 3,top.y / 2.f });

    SetColor(0, 0, 1);
    DrawSierpinskiTriangle(Point2f{ right.x / 2,left.y }, Point2f{ right.x / 4.f * 3,top.y / 2.f }, right);

    SetColor(1, 0, 0);
    DrawSierpinskiTriangle(left, Point2f{ top.x / 2.f,top.y / 2.f }, Point2f{ top.x,left.y });

}
void DrawSierpinskiTriangle(常量点2F和左侧、常量点2F和顶部、常量点2F和右侧)
{

if(right.x-left.x我可以在发布的递归方案中看到几个问题

  • 终止条件假设点<代码>右侧始终位于点<代码>左侧的右侧,并且“底部”边缘(连接这两个点的边缘)不垂直。这些可能是也可能不是未提及的前提条件的一部分

  • 用于计算传递给递归调用的坐标的转换是错误的。对于特定的第一步,它们可能是正确的,但不是一般的

    我们需要找出三角形边的中点,这取决于传递给函数的点

    #include <numeric>      // std::midpoint
    
    Point2f midpoint(Point2f const& a, Point2f const& b)
    {
        // See e.g. https://en.cppreference.com/w/cpp/numeric/midpoint
        return {std::midpoint(a.x, b.x), std::midpoint(a.y, b.y)};
    }
    
    void DrawSierpinskiTriangle(const Point2f& left, const Point2f& top, const Point2f& right)
    {
        // Ok, let's assume that the bottom edge is horizontal
        if ( right.x - left.x <= 100)
        {
            return;
        }
    
        auto a{ midpoint(left, top) };  
        auto b{ midpoint(top, right) };  
        auto c{ midpoint(right, left) };
    
        // ...
    
        // Top
        DrawSierpinskiTriangle(a, top, b);
    
        // Bottom right
        DrawSierpinskiTriangle(c, b, right);
    
        // Bottom left
        DrawSierpinskiTriangle(left, a, c); 
    }
    
    #包括//标准::中点
    点2F中点(点2F常数和a、点2F常数和b)
    {
    //见例。https://en.cppreference.com/w/cpp/numeric/midpoint
    返回{std::middpoint(a.x,b.x),std::middpoint(a.y,b.y)};
    }
    空心图纸斜三角形(常数点2F和左侧、常数点2F和顶部、常数点2F和右侧)
    {
    //好,让我们假设底边是水平的
    
    如果(right.x-left.x是什么阻止您添加显示每个递归调用的参数的简单调试语句,从而显示哪些值是无限递归的?您得到的是堆栈溢出,因为right.x-left.x在可处理的堆栈数限制内永远不会小于或等于100。仍然会导致ack overflow?--当您说“仍然导致”时,这是否意味着它在您进行更改之前导致了堆栈溢出,并且堆栈溢出仍在发生?如果是,则可能您所做的更改没有解决问题,您需要重新访问这些更改。要让您询问有关堆栈溢出的问题。