【发布时间】:2018-03-16 17:56:44
【问题描述】:
我写了一个程序来显示用户输入的点之间的点。
例如:用户键入点A(1|1) 和B(10|10),因此程序返回在A 和B 之间形成一条线的所有点(因此(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 处理
i和j那样的静态“状态”变量。最好只传递函数写入的指针作为参数(或传递索引)。指针是/索引是为调用代码中的每个递归调用计算的。考虑递归打印二叉树。你只是得到一个根节点,你并不关心或想知道你有多深。堆栈会对此进行跟踪。 -
当第二个点坐标低于第一个点坐标时会发生什么?当第二个点坐标在第一个点坐标的左边时会发生什么?
标签: c function recursion store