【问题标题】:racket - algorithm to cut din Ax球拍 - 切割 din Axe 的算法
【发布时间】:2015-05-16 18:14:30
【问题描述】:

我正在开发一个迷你游戏,如果我输入 DIN-Ax,我需要找出我可以在 DIN-A0 纸上画多少行。例如:

;car horizontal and cdr vertical lines
(define A1 (list 0 1))
(define A2 (list 1 1))
(define A3 (list 1 3))
(define A4 (list 3 3))
(define A5 (list 3 7))
(define A6 (list 7 7))
(define A7 (list 7 15))
(define A8 (list 15 15))
(define A9 (list 15 31))
(define A10(list 31 31))  

如果我输入 A1,我可以绘制 0 条水平线和 1 条垂直线,依此类推。我手动计算了它们,但我想知道是否有更优雅的算法来自动获取它,因为我无法开发一个。以下是有关 DIN 的更多信息: http://en.wikipedia.org/wiki/ISO_216

谢谢

编辑:这说明了我的意思。

http://www.prepressure.com/library/paper-size/din-a4

使用 A1,您可以绘制 (0 1) 表示 1 条垂直线。 使用 A2,您可以绘制 (1 1) 表示 1 条水平线和 1 条垂直线,因为 A0 表中有四个 A2。以此类推,A3 (1 3)...

编辑:几乎完成了,我只需要弄清楚如何处理第一次迭代,因为如果我写 (get-cuts 1 0 0 0) 我得到了 DIN Ax-1 切割。当我有更多时间时,我会解决它。

(define (get-cuts DIN-A count vl hl)
  (cond 
    ((= DIN-A count) (list vl hl))
    ((not(= (modulo count 2) 0)) (get-cuts DIN-A (+ count 1) hl (+(* hl 2) 1))) ; DIN-A impares
    ((= (modulo count 2) 0) (get-cuts DIN-A (+ count 1) hl hl )) ; DIN-A pares
  )
)

【问题讨论】:

  • 当您说“等等”时,我知道在 A2 中您可以绘制 1 条水平线和 2 条垂直线,但是在您提供的代码中,您将 A2 定义为 (1 1)。哪个不正确?
  • 对不起,我的意思是 A1 A2 列表中的等等......在 A0 中,您可以安装 4 个 A2,这就是为什么它是 1 1。
  • 水平/垂直线是什么意思?你能画出“画”一条线的样子吗?举个例子……我们需要更多关于你的问题的信息,试着多解释一下自己。
  • 添加了一个有插图的网站。希望现在很清楚
  • 如果您不断将每个新部分分成两半,您的行数将不受限制。你想去兔子洞多远?

标签: algorithm racket


【解决方案1】:

你想要的是一个算法,所以我做了一个:

假设您有 A0,您可以绘制 0 条水平线(我们称之为 A0.hl)和 0 条垂直线(我们称之为A0.vl)。

那么对于A1你可以分别画A0.vl(A0.vl*2)+1水平线和垂直线。

与 A2 类似,您可以绘制 A1.vl(A1 的垂直线数)水平线和完全相同数量的垂直线(这是因为我们正在检查一对编号 [2])。

因此,对于任何 x>1,使用x%2 != 0:对于 Ax,您可以水平绘制 Ax-1.vl线和(A*x-2.vl* * 2) + 1 垂直线。

对于任何 x>1,使用 x%2 == 0:对于 Ax,您可以绘制 Ax-1.vl 水平线和 Ax-1.vl 垂直线。

你可以用尾递归来做到这一点;也许保留对数和奇数(4个变量)的水平和垂直线的数量,但也许有一种简单的方法,而不必保留所有这些变量。我会考虑更多,但我现在得走了。

希望这可以帮助您获得更好的想法!

如有任何疑问,请告诉我们;)

【讨论】:

  • 谢谢,这正是我想要的。我编辑了我的帖子
  • 别担心,如果它解决了你的问题,记得标记为答案!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-05-20
  • 2018-05-04
  • 2015-04-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多