【问题标题】:The Art of Computer Programming exercise question: Chapter 1, Question 8计算机编程艺术练习题:第 1 章,第 8 题
【发布时间】:2010-10-09 04:20:04
【问题描述】:

我正在做 TAOCP 第 1 卷第 3 版的练习,但无法理解以下练习答案中使用的语法。

第 1 章练习 8

通过指定 Tj,sj,aj,b 计算正整数 m & n 的最大公约数j

让您的输入由字符串 ambn 表示(m a's 后跟 n b's)

答案:

令 A = {a,b,c},N=5。该算法将以字符串 agcd(m,n)

终止 j Tj sj bj aj 0 ab(空) 1 2 删除一个 a 和一个 b,或转到 2。 1(空) c 0 0 在最左边添加 c,返回 0。 2 a b 2 3 将所有 a 更改为 b 3 c a 3 4 将所有 c 更改为 a 4 b b 0 5 如果 b 剩余,重复

我难以理解的部分只是如何解释这张表。 此外,当 Knuth 说这将以字符串 agcd(m,n) 结束时——为什么 gcd(m,n) 的上标?

感谢您的帮助!

编辑了更多问题:

什么是 Tj -- 注意 T = Theta

什么是 sj -- 注意 s = phi

您如何解释列 bj 和 aj

为什么 Knuth 将解决方案中的新符号转换为他没有在文本中解释的示例?只是令人沮丧。谢谢!!!

【问题讨论】:

  • 上标是因为字符串将由 "gcd(m,n)" a's 组成。因此,例如,对于 gcd(3,6) = 3,字符串将为“aaa”。
  • 现在上标确实有意义——谢谢!

标签: knuth taocp


【解决方案1】:

这是该练习答案的implementation。也许有帮助。

顺便说一下,表格似乎描述了Markov algorithm

据我所知,您从第一个命令集 j = 0 开始。将 Tj 的任何出现替换为 sj 并跳转到下一个命令行取决于您是否替换了任何内容(在这种情况下跳转到 bj,如果没有任何内容被替换,则跳转到 aj)。

编辑:新答案:

A = {a,b,c} 似乎是您可以使用的字符集。 c 在算法过程中出现(添加到左侧,然后再次被 a 替换)。

Theta 和 phi 可能是一些您通常用于“原始”和“替换”之类的希腊字符,尽管我不知道它们是什么。

bj 和 aj 是接下来要执行的表格行。这与最后一列中人类可读的描述相匹配。

我唯一不能回答的是,为什么 Knuth 使用这种表示法没有任何解释。我又浏览了本书的第一章和解决方案,他没有在任何地方提及。

EDIT2:gdc(2,2) = 2 的示例

输入字符串:aabb 第 0 行:删除一个 a 和一个 b,或转到 2。 => ab => 转到 1 第1行:在最左边添加c,回到0。 => 出租车 => 去 0 第 0 行:删除一个 a 和一个 b,或转到 2。 => c => 转到 1 第1行:在最左边添加c,回到0。 => 抄送 => 去 0 第 0 行:删除一个 a 和一个 b,或转到 2。 没有找到ab,所以转到2 第 2 行:将所有 a 更改为 b 没有找到a,所以转到3 第 3 行:将所有 c 更改为 a => 一个 第 4 行:如果 b 仍然存在,则重复 没有找到 b,所以转到 5(结束)。 => 答案是“aa” => gdc(2,2) = 2

顺便说一句,我认为第 1 行的描述应该是“删除一个“ab”,或者转到第 2 行。”这让事情变得更清楚了。

【讨论】:

  • 我在问题中添加了更多内容,以帮助澄清我不明白的内容,如果您可以提供更多帮助。谢谢!
  • 我终于明白了。对我来说,缺少的部分是 aaaa = 4 的答案。啊哈!我想我现在理解了表格符号——似乎 bj 在仍有“输入左侧”时使用,反之亦然。这是标准吗?例如如果你还有 a's 继续重复 2
【解决方案2】:

am 的概念可能是状态机上下文中输入字符串的概念。

这样的概念用于指代m 连续的a 实例,即:

a4 = aaaa
b7 = bbbbbbb
a4b7a3 = aaaabbbbbbbaaa

而agcd(m,n)的意思是在运行(解决方案)状态机之后,结果字符串应该是gcd(m,n)实例a

换句话说,结果中a的数量应该等于gcd(m,n)的结果

我同意@schnaader 的观点,因为它可能是一个描述马尔可夫算法用法的表格。

【讨论】:

    【解决方案3】:

    gcd(m,n) 的上标是由于数字在此表中的表示方式。

    例如:m => a^m n => b^n

    gcd(m,n) => a^gcd(m,n)

    看起来好像正在实施欧几里得算法。 即

    gcd(m,n):
      if n==0:
        return m
      return gcd(n,m%n)
    

    数字表示为幂,以便能够进行模运算 m%n。

    例如,4 % 3,将按如下方式计算: 4 'a's (a^4) mod 3 'b's (b^3),这将留下 1 'a' (a^1)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-10-08
      • 2015-04-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-06-06
      • 1970-01-01
      相关资源
      最近更新 更多