计算机编程艺术练习题:第1章,问题8

时间:2009-02-22 16:51:09

标签: knuth taocp

我正在练习TAOCP第1版第3版,并且无法理解下面练习答案中使用的语法。

第1章练习8

计算正整数的最大公约数m& n通过指定T j ,s j ,a j ,b j

让你的输入用字符串a m b n 表示(m a后跟n b)

答案:

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

结束
    j     Tj     sj    bj    aj
    0     ab  (empty)  1    2   Remove one a and one b, or go to 2.
    1   (empty)  c     0    0   Add c at extreme left, go back to 0.
    2     a      b     2    3   Change all a's to b's
    3     c      a     3    4   Change all c's to a's
    4     b      b     0    5   if b's remain, repeat

我理解困难的部分只是如何解释这个表。 另外,当Knuth说这将以字符串a sup> gcd(m,n)终止时 - 为什么gcd(m,n)的上标?

感谢您的帮助!

编辑了更多问题:

什么是T j - 请注意T = Theta

什么是s j - 请注意s = phi

如何解释b j j 的列?

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

3 个答案:

答案 0 :(得分:4)

这是练习答案的implementation。也许它会有所帮助。

顺便说一句,该表似乎描述了Markov algorithm

据我所知,到目前为止,你从第一个命令集开始,j = 0.用s j 替换任何出现的T j 并跳转到下一个命令行取决于你是否替换了任何东西(在这种情况下跳转到b j ,如果没有替换,跳转到 j )。

编辑:新答案:

A = {a,b,c}似乎是您可以操作的字符集。 c在算法期间进入(添加到左侧,然后再用a替换)。

Theta和phi可能是一些希腊字符,通常用于“原创”和“替换”之类的东西,虽然我不知道它们是什么。

b j j 是下次执行的表格行。这与最后一栏中的人类可读描述相符。

我唯一无法回答的是为什么Knuth使用这种符号而没有任何解释。我再次浏览了书中的第一章和解决方案,并没有在任何地方提及它。

EDIT2:gdc(2,2)= 2

的示例
    Input string: aabb
    Line 0: Remove one a and one b, or go to 2.
    => ab => go to 1
    Line 1: Add c at extreme left, go back to 0.
    => cab => go to 0
    Line 0: Remove one a and one b, or go to 2.
    => c => go to 1
    Line 1: Add c at extreme left, go back to 0.
    => cc => go to 0
    Line 0: Remove one a and one b, or go to 2.
    No ab found, so go to 2
    Line 2: Change all a's to b's
    No a's found, so go to 3
    Line 3: Change all c's to a's
    => aa
    Line 4: if b's remain, repeat
    No b's found, so go to 5 (end).

    => Answer is "aa" => gdc(2,2) = 2

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

答案 1 :(得分:1)

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

例如:m =>一个^米 n => b ^ N

gcd(m,n)=>一个^ GCD(M,N)

看起来好像正在实施Euclids算法。 即。

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

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

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

答案 2 :(得分:1)

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

这种概念用于指代连续m的{​​{1}}个实例,即:

  

a 4 = aaaa
  b 7 = bbbbbbb
  a 4 b 7 a 3 = aaaabbbbbbbaaa

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

换句话说,结果中a的数量应该等于a的结果

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