c在控制台中绘制直线

时间:2015-04-11 14:35:19

标签: c console console-application

我正试图在我的控制台中用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)(中心线),然后我必须放另一条线,但我有两条线,另外两条线在每个中间。

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

由于 最好的问候

1 个答案:

答案 0 :(得分:1)

想象一下实数行上的段[0,1],并评估标尺(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步:然后将8个长度为 n -3的标记放置在:1 / 16,3 / 16,5 / 16,... 15/16

...

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

对于标尺 l r n ),这些分数将相同,但相反例如,3/4,你将把标记放在 a b 之间的四分之三处。这只是: 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));
    }
}