我正在练习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在解决方案中将新的符号转换为他未在文中解释的示例?只是令人沮丧。感谢!!!
答案 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,因为它可能是一个描述马尔可夫算法用法的表。