我试图在 Ruby 中实现 Karatsuba 乘法..
# 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
,当我在line no:3
中使用print "#{x*y}"
时,它会打印3、4、6、8。我无法理解为什么 mult
方法为 x*y
返回 nil
。
最佳答案
问题是错误的迭代器:
# ⇓⇓⇓⇓
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]
关于ruby - 方法不返回 Ruby 中的预期值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44263031/