Это можно записать так:
def multiplier(*args)
prod = recurse(*args.map(&:abs))
args.count { |n| n < 0 }.even? ? prod : -prod
end
def recurse(first, *rest)
first.zero? || rest.empty? ? first : ([recurse(*rest)]*first).sum
end
multiplier(3, 10, 4) #=> 120
multiplier(3, 10, 4, 2, 3) #=> 720
multiplier(3, -10, 4) #=> -120
multiplier(3, -10, -4) #=> 120
multiplier(3, 0, 4) #=> 0
multiplier(3, 0, -4) #=> 0
Предположим, мы хотим вычислить multiplier(3, -4)
.recurse(3, 4)
называется, где
first = 3
rest = [4]
first.zero? #=> false
rest.empty? #=> false
, поэтому мы вычисляем
([recurse(4)]*3).sum
In recurse(4)
,
first = 4
rest = []
As rest.empty #=> true
, recurse
возвращает first #=> 4
, поэтому
([recurse(4)]*3).sum]
#=> ([4]*3).sum => [4,4,4].sum => 12
возвращается к multiplier
.Поскольку [3, -4]
содержит нечетное число отрицательных значений, множитель возвращает -12
.