【发布时间】:2014-12-12 15:43:12
【问题描述】:
下面我已将代码发布到 ruby 中的非工作“分而治之”乘法方法(带有调试打印)。我不知道它的代码是否损坏,或者是 Ruby 中的一个怪癖,比如 L-shift(
是代码损坏(与原始算法不匹配)还是意外行为?
Pseudo code for original algorithm
def multiply(x,y,n, level)
#print "Level #{level}\n"
if n == 1
#print "\tx[#{x.to_s(2)}][#{y.to_s(2)}]\n\n"
return x*y
end
mask = 2**n - 2**(n/2)
xl = x >> (n / 2)
xr = x & ~mask
yl = y >> (n / 2)
yr = y & ~mask
print " #{n} | x = #{x.to_s(2)} = L[#{xl.to_s(2)}][#{xr.to_s(2)}]R \n"
print " #{n} | y = #{y.to_s(2)} = L[#{yl.to_s(2)}][#{yr.to_s(2)}]R \n"
#print "\t[#{xl.to_s(2)}][#{yr.to_s(2)}]\n"
#print "\t[#{xr.to_s(2)}][#{yr.to_s(2)}]\n"
#print "\t([#{xl.to_s(2)}]+[#{xr.to_s(2)}])([#{yl.to_s(2)}]+[#{yr.to_s(2)}])\n\n"
p1 = multiply( xl, yl, n/2, level+1)
p2 = multiply( xr, yr, n/2, level+1)
p3 = multiply( xl+xr, yl+yr, n/2, level+1)
return p1 * 2**n + (p3 - p1 - p2) * 2**(n/2) + p2
end
x = 21
y = 22
print "x = #{x} = #{x.to_s(2)}\n"
print "y = #{y} = #{y.to_s(2)}\n"
print "\nDC_multiply\t#{x}*#{y} = #{multiply(x,y,8, 1)} \nregular\t#{x}*#{y} = #{x*y}\n\n "
【问题讨论】:
-
我在你的代码中没有看到
<<... -
正确,因为它只是将东西向左(永远)移动,所以我做了一个面具并从上半部分“和”
-
你的代码输出了大量的调试数据。预期的输出/行为是什么?
-
最终是应该做乘法。该算法是递归的,因此它通过调用堆栈创建了一个类似树的“模式”,这也可以通过位数(n)和每个x和y的右/左拆分来看出。
-
当然可以,但是调试输出与 C++ 实现有何不同?
标签: ruby divide-and-conquer multiplication