Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/144.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 - Fatal编程技术网

无参数递归 我需要创建一个C++程序,它使用递归,没有参数来计算多边形的面积,但将其分解成更小的三角形。

无参数递归 我需要创建一个C++程序,它使用递归,没有参数来计算多边形的面积,但将其分解成更小的三角形。,c++,recursion,C++,Recursion,我的问题是,当递归函数不调用任何参数时,我不理解如何创建递归函数,不幸的是,Google也没有帮助我找到任何信息 我想我已经创建了我的基本案例,但不确定下一步要去哪里 double Polygon::get_area() const{ if ((xs.size() <3) || (ys.size() <3)) return 0; if ((xs.size() == 3) || (ys.size() == 3)) return ((xs[0]*ys[1] + xs[1]*

我的问题是,当递归函数不调用任何参数时,我不理解如何创建递归函数,不幸的是,Google也没有帮助我找到任何信息

我想我已经创建了我的基本案例,但不确定下一步要去哪里

double Polygon::get_area() const{
   if ((xs.size() <3) || (ys.size() <3)) return 0;
   if ((xs.size() == 3) || (ys.size() == 3))  return ((xs[0]*ys[1] + xs[1]*ys[2] + xs[2]*ys[0]) - ys[0]*xs[1]- ys[1]*xs[2] - ys[2]*xs[0]) / 2;

};
double Polygon::get_area()const{
如果((xs.size(),因为您只是问如何做?那么,这里是:

  • 创建一个类
    Polygon
  • 多边形
    具有一个数据成员作为多边形坐标数组
  • 创建一个私有成员函数,该函数对多边形坐标进行操作并返回多边形的面积
  • Polygon
    具有公共成员函数
    double get\u area()
    。在
    get\u area()
    中调用递归函数来计算面积并返回结果
您可以看到非递归实现和递归实现

以下是非递归实现的代码:

#include <iostream>
#include <vector>
#include <cmath>
using namespace std;

/**
Class to represent a point in plane
*/
class Point
{
    public:
    int X, Y;
    Point(int x, int y){X = x; Y = y;}
};

class Polygon
{
    //To hold the points
    vector<Point*> coordinates;
    
    public:
    //constructor:
    //  sides - For polygone, side = number of points
    //  points - All points of polygon as (x, y) pair
    Polygon(int sides, int points[][2])
    {
        //Add all points to the vector 'coordinates'
        while(--sides >= 0)
        {
            coordinates.push_back(new Point(points[sides][0], points[sides][1]));
        }
    }
    
    //Helper function to add a point at a latter time with given (x, y)
    void addPoint(int x, int y)
    {
        coordinates.push_back(new Point(x, y)); 
    }
    
    //Helper function to add a point at a latter time with given obect of Point
    void addPoint(Point point)
    {
        coordinates.push_back(new Point(point.X, point.Y)); 
    }
    
    double getArea()
    {
        double area = 0;
        int len = coordinates.size();
        //Fix the point at 0 coordinate
        Point p1 = *coordinates[0];
        while(--len >1)
        {
            //get other 2 points to create traingle
            Point p2 = *coordinates[len];
            Point p3 = *coordinates[len -1];
            area += abs((p1.X*(p2.Y - p3.Y) + p2.X*(p3.Y - p1.Y) + p3.X*(p1.Y - p2.Y))/2.0);
        }
        return area;
    }
    
    ~Polygon()
    {
        //Free dynamically allocated memory
        int len = coordinates.size();
        while(len--)
        {
            delete coordinates[len];
        }
    }
};


int main() {
    int sides[][2] = {{15,15}, {23,30}, {50,25}};
    Polygon p(3, sides);
    cout<<p.getArea()<<endl;
    return 0;
}
#包括
#包括
#包括
使用名称空间std;
/**
类来表示平面中的点
*/
类点
{
公众:
int X,Y;
点(intx,inty){x=x;y=y;}
};
类多边形
{
//抓住要点
矢量坐标;
公众:
//建造商:
//侧面-对于多边形,侧面=点数
//点-多边形的所有点作为(x,y)对
多边形(整数边,整数点[][2])
{
//将所有点添加到向量“坐标”
而(--边>=0)
{
坐标。推回(新点(点[边][0],点[边][1]);
}
}
//辅助函数,用于在以后的时间添加具有给定(x,y)的点
无效添加点(整数x,整数y)
{
坐标。推回(新点(x,y));
}
//辅助函数,用于在以后的时间使用给定的点对象添加点
无效添加点(点-点)
{
坐标。推回(新点(点X,点Y));
}
双getArea()
{
双面积=0;
int len=coordinates.size();
//将点固定在0坐标处
点p1=*坐标[0];
而(--len>1)
{
//获取其他2个点以创建traingle
点p2=*坐标[len];
点p3=*坐标[len-1];
面积+=abs((p1.X*(p2.Y-p3.Y)+p2.X*(p3.Y-p1.Y)+p3.X*(p1.Y-p2.Y))/2.0);
}
返回区;
}
~Polygon()
{
//释放动态分配的内存
int len=coordinates.size();
而(len--)
{
删除坐标[len];
}
}
};
int main(){
内边[][2]={{15,15},{23,30},{50,25};
多边形p(3,边);

cout从字面上理解要求
double get_area()const
是递归的,这意味着您必须使用成员变量跟踪面积计算的状态。此外,该成员变量必须标记为
mutable
,因为
get_area
声明为
const

在我看来,最简单的方法是存储当前正在计算面积的三角形的索引。这将从1运行到
xs.size()-2
(对于N边凸多边形,只有N-2个非零面积三角形需要获得面积)。您不需要将中间区域存储在任何位置,因为
return
语句的格式为
return(当前三角形的区域)+get_area();

显然,
get_区域
需要增加(可变)当前三角形的索引。当您到达最后一个三角形时,您需要将索引重置回1,以便下次调用它时它将重新开始。您还必须使用一个单独的return语句停止递归,该语句不调用
get\u area
,只返回最终三角形的面积

当然,正如其他人指出的那样,这并不是解决这个问题的最自然的方法,循环会更有意义。我不确定你的导师是否仔细地表达了要求,迫使你思考如何解决这个特定的技术挑战,或者要求实际上并没有看起来那么严格。例如,你可能这是一个测试,看看你是否记住了你所学的内容。如果你知道你是如何做到这一点的,以及你的导师的意图是什么,那就太好了


编辑

您的评论表明,此处的目的是递归地将多边形减少一个顶点,因此想法是让
get_area
返回涉及前3个顶点的三角形区域,然后创建另一个“polygon”对象,忽略第一个三角形并调用
get_area
>因此,get_area
不在同一个
多边形
实例中,而是跨实例链。在伪代码中:

Polygon::get_area() const
{
  if ( polygon is a point or line )
  {
    return 0;
  }
  else if ( polygon is a triangle )
  {
    return area of triangle;
  }
  else
  {
    Polygon reducedPolygon;
    Add all vertices apart from the second vertex to reducedPolygon
    return (area of triangle of first three vertices)
         + reducedPolygon.get_area();
  }

}

你在解释这些要求。因为你似乎被它们弄糊涂了,所以你无法准确地表达它们。首先逐字引用它们,然后添加你的想法,这将使这成为一个恰当的问题,减少猜测。抱歉@UlrichEckhardt,问题是:带角的三角形(x1,y1)、(x2,y2)、(x3,y3)有面积:(x1*y2+x2*y3+x3*y1-y1*x2-y2*x3-y3*x1)/2我们可以通过将凸多边形切割成三角形来计算其面积。计算每个三角形的面积并求和,得出多边形的面积。在polygon.cpp中将get_area()作为递归函数实现。还可以实现成员函数add()在polygon.cpp.Methods中有一个隐藏的
这个
参数;因此它不是没有参数的真正递归。顺便说一句,你不需要递归来计算面积,你可以
Polygon::get_area() const
{
  if ( polygon is a point or line )
  {
    return 0;
  }
  else if ( polygon is a triangle )
  {
    return area of triangle;
  }
  else
  {
    Polygon reducedPolygon;
    Add all vertices apart from the second vertex to reducedPolygon
    return (area of triangle of first three vertices)
         + reducedPolygon.get_area();
  }

}