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?--当您说“仍然导致”时,这是否意味着它在您进行更改之前导致了堆栈溢出,并且堆栈溢出仍在发生?如果是,则可能您所做的更改没有解决问题,您需要重新访问这些更改。要让您询问有关堆栈溢出的问题。