c 在控制台中绘制直线

标签 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)(中心线),然后我必须放另一条线,但我有 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/

相关文章:

c - 包 C 控制台应用程序 (Visual Studio '13)

asp.net-mvc - TFS 2015 CI - 具有 Web、控制台和 WCF 项目的解决方案中不会为控制台应用程序生成构建工件

shell - 如何在 travis-ci 上解析控制台并找到出现的单词数

ruby-on-rails - 如何在 Fargate 容器中启动 rails 控制台

有人可以告诉我我的代码有什么问题吗?

c - 为什么我的代码没有引发重复符号冲突

powershell - 如何在 Windows 上的 Go (golang) 中打印 UTF-8(或 unicode)字符

c# - 监听和接受连接的简单 Telnet 控制台

c - 为 AVR 端口使用位字段

c++ - 如何使用 C++ 或 C 在大文件中查找特殊值