【问题标题】:How can I save values from recursive functions in c?如何在c中保存递归函数的值?
【发布时间】:2018-03-16 17:56:44
【问题描述】:

我写了一个程序来显示用户输入的点之间的点。

例如:用户键入点A(1|1)B(10|10),因此程序返回在AB 之间形成一条线的所有点(因此(2|2) (3|3)(4|4)(5|5)(6|6) 等..(想象一个二维数组)。 为了计算两者之间的点,我使用了一个递归函数,如下所示:

void line(struct point A, struct point B) {
    struct point M;
    if ((A.x - B.x >= -1 && A.x - B.x <= 1) && (A.y - B.y >= -1 && A.y - B.y <= 1)) {
        printf("P(%i|%i) P(%i|%i)\n", A.x, A.y, B.x, B.y);

    }
    else {
        M.x = (A.x + B.x) / 2;
        M.y = (A.y + B.y) / 2;
        line(A, M);
        line(M, B);

    }
}

现在我必须将其可视化,这意味着创建一个二维数组,其中显示点 A 和 B,其间的点可以是每个字符(例如 * 或 0)。我该怎么做,因为我不知道如何保存递归函数的值?我想了很多,但没有找到解决办法。

【问题讨论】:

  • 我个人只会保留计算的点列表。即一维数组中的M,然后读取它。无论如何,数组都是通过引用传递的。因此,无论您选择 1-d 还是 2-3 数组,只需将其作为参数发送给函数并继续将 m 的新值推送到该数组。二维数组的缺点是读取数组时不知道下一步该去哪里。
  • 也许您可以通过递归(及其元素数)传递一个指向已分配内存的指针,在满时重新分配,将下一个插值点添加到末尾,并返回元素数。最后在打印之前对数组进行排序。在转换为函数参数和返回值之前,首先使用全局变量可能更容易。
  • 通常您会尝试使用不需要“状态”的解决方案,除了由递归调用隐式构建的堆栈。特别是应该避免像 Abhijit 处理 ij 那样的静态“状态”变量。最好只传递函数写入的指针作为参数(或传递索引)。指针是/索引是为调用代码中的每个递归调用计算的。考虑递归打印二叉树。你只是得到一个根节点,你并不关心或想知道你有多深。堆栈会对此进行跟踪。
  • 当第二个点坐标低于第一个点坐标时会发生什么?当第二个点坐标在第一个点坐标的左边时会发生什么?

标签: c function recursion store


【解决方案1】:

在递归函数中声明一个静态二维数组。最后返回那个数组。

这只是一个示例,并非最终解决方案。因此,您必须在代码中应用此示例:-

int** line(struct point A, struct point B)
{
   static int** array2D =(int **)malloc(somesize * sizeof(int *));

   static int i=0;
   static int j=0;

   .
   .
   M.x = (A.x + B.x) / 2;
   M.y = (A.y + B.y) / 2;

   array2D[i][j++] =  M.x;
   array2D[i++][j] =  M.y;
   .
   .

 return array2D;

【讨论】:

  • 我喜欢你在每次新调用line() 时泄露你之前分配的array2D。我也喜欢你称它为“2D”,因为它显然是 1D。
  • @PeterA.Schneider 我假设您认为,因为它是static,所以它在第一次遇到时只被初始化一次。虽然这是真的,但分配非0 指针(分配空间的位置)的点不在那个时间点;每次拨打 line() 时都会收到。
  • new 是什么?
  • @WeatherVane 好点。根据您的超级代表,我猜您知道这一点,但对其他人来说:那是 C++ 的 malloc() 版本。这是一道 C 题。
  • @phonetagger 是啊,alloc 每次都会被调用,没错,反正现在代码已经变了……
【解决方案2】:

您可以传递一个指向结构的指针并将点存储到该结构中的数组中:

struct curve {
    size_t pos, size;
    struct point *points;
};

void line(struct curve *cp, struct point A, struct point B) {
    if ((A.x - B.x >= -1 && A.x - B.x <= 1)
    &&  (A.y - B.y >= -1 && A.y - B.y <= 1)) {
        if (cp->pos >= cp->size) {
            int new_size = (cp->size + cp->size / 2 + 6);
            struct point *np = realloc(cp->points, sizeof(*np) * new_size);
            if (np == NULL) {
                fprintf(stderr, "out of memory\n");
                exit(1);
            }
            cp->points = np;
            cp->size = new_size;
        }
        if (cp->pos == 0) {
            cp->points[cp->pos++] = A;
        }
        cp->points[cp->pos++] = B;
    } else {
        struct point M;
        M.x = (A.x + B.x) / 2;
        M.y = (A.y + B.y) / 2;
        line(cp, A, M);
        line(cp, M, B);
    }
}

初始调用:

    struct curve c = { 0, 0, NULL };
    line(&c, A, B);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-03-03
    • 2023-01-15
    • 2021-12-13
    • 2019-06-19
    • 2016-02-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多