2017-05-30 63 views
1

我试图在Ruby中实现Karatsuba乘法没有返回预期值..方法在Ruby中

# takes two integer x and y and partition them to x=a+b and y=c+d 
# example if x = 1234 a=12 and b=34 
# recursively compute a*c,a*d,b*c and b*d 
def mult (x,y) 
    if len(x) == 1 && len(y) == 1 
      return x*y 
     elsif len(x) > 1 && len(y) > 1 
      ab = partition(x) 
      cd = partition(y) 
      return ab.product(cd).each{ |num| mult(num[0],num[1]) } 
     end 
end 
#method for partitioning works fine.. 
def partition(number) 
    number.divmod(10**(len(number)/2)) 
end 
#method to find size of integer works fine... 
def len(value) 
    value.to_s.split("").compact.size 
end 

因此,预期收益为

p mult(12,34) should be 3,4,6,8 
but is [[1, 3], [1, 4], [2, 3], [2, 4]] 

代替return x*y,当我使用print "#{x*y}"line no:3它打印3,4,6,8。我无法理解为什么mult方法返回nilx*y

+0

'len(x)'?这听起来像Python – Ursus

+1

@Ursus它听起来像自我实现的方法,检查代码段的最后3行。 – mudasobwa

回答

4

的问题是错误的迭代器:

#    ⇓⇓⇓⇓  
ab.product(cd).each{ |num| mult(num[0],num[1]) } 

你想要的是Enumerable#map代替:

ab.product(cd).map { |num| mult(num[0], num[1]) } 

旁注:你也不需要显式调用return

def mult (x,y) 
    if len(x) == 1 && len(y) == 1 
    x*y 
    elsif len(x) > 1 && len(y) > 1 
    ab = partition(x) 
    cd = partition(y) 
    ab.product(cd).map { |num| mult(num[0], num[1]) } 
    else 
    raise "We got a problem" 
    end 
end 
#method for partitioning works fine.. 
def partition(number) 
    number.divmod(10**(len(number)/2)) 
end 
#method to find size of integer works fine... 
def len(value) 
    value.to_s.size 
end 

p mult 12, 34 
#⇒ [3,4,6,8] 
+0

感谢它的工作,我在打印'[[1,3],[1,4],[2,3],[2,4]]'时应该知道并停止了 – 0sfh

+0

但为什么不是'each'正常工作当我必须迭代每个值并将其传递给'mult(x,y)'方法时。 – 0sfh

+0

因为'each'本身返回迭代,而'map'实际上将迭代转换为从'mult'方法返回的新值。 – mudasobwa