gpt4 book ai didi

c 在控制台中绘制直线

转载 作者:太空宇宙 更新时间:2023-11-04 03:39:42 25 4
gpt4 key购买 nike

我正在尝试在我的控制台中用 c 绘制直线。

我有一个递归程序:

void mark(int m, int h) {
printf("set a mark at %d of length %d\n",m,h);
}

void ruler(int l, int r, int h) {
int m = (l+r)/2;
if (h>0) {
mark(m, h);
ruler(l, m, h-1);
ruler(m, r, h-1);
}
}

我必须画一条直线:

enter image description here

我的问题是我有第一行标记 (4,3)(中心线),然后我必须放另一条线,但我有 2 条线,每条中间有两条线。

有人知道怎么做吗?或者如何将其转换为非递归算法?

谢谢最好的问候

最佳答案

想象实数轴上的线段 [0, 1],并计算 ruler(0, 1, n):

  • 第 1 步:首先,将长度为 n 的标记放置在中间,即 1/2 处,将线段一分为二
  • 第 2 步:然后在每一半的中间放置两个长度为 n-1 的标记:1/4 和 3/4。
  • 第 3 步:然后放置四个长度为 n-2 的标记:1/8、3/8、5/8、7/8。<
  • 第 4 步:然后将八个长度为 n-3 的标记放置在:1/16、3/16、5/16、... 15/16 .

...

  • 第 n 步:最后,您将长度为 1 的 2 个n-1 标记放置在:1/2n、3/2< sup>n, 5/2n, ...(2n-1)/2n.

对于标尺(lrn),这些分数将相同,但相反例如,3/4,您将把标记放在 ab 之间的四分之三处。这很简单:l + (r - l) * 3/4。

将这种方法转化为 C 代码,我们可以将您的函数非递归地编写为:

void ruler(int l, int r, int n) {
int step, num, denom;
for (step = 1; step <= n; step++) {
denom = 1 << step;
for (num = 1; num < denom; num += 2)
mark(l + (r-l) * num / denom, n - (step - 1));
}
}

关于c 在控制台中绘制直线,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29579064/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com