Вот подсказка я был дана:Рекурсия с участием массива для шаткого монета
Catsylvanian денег странной вещь: у них есть монета для каждого номинала (включая ноль!). Увлекательная машина смены в Catsylvania берет любую монету N и возвращает 3 новых монеты, , оцененных в N/2, N/3 и N/4 (округление).
Напишите метод wonky_coins(n)
, который возвращает количество монет, вы остается, если вы берете все ненулевые монеты и продолжать кормить их обратно в машину, пока не останется только с нулевой стоимостью монеты.
Сложность: 3/5
describe "#wonky_coins" do
it "handles a simple case" do
wonky_coins(1).should == 3
end
it "handles a larger case" do
wonky_coins(5).should == 11
# 11
# => [2, 1, 1]
# => [[1, 0, 0], [0, 0, 0], [0, 0, 0]]
# => [[[0, 0, 0], 0, 0], [0, 0, 0], [0, 0, 0]]
end
it "handles being given the zero coin" do
wonky_coins(0).should == 1
end
end
Может быть, это из-за испытаний данных, которые включают массивы, но я не мог получить свой ум от них! Поэтому мое решение до сих пор выглядит следующим образом:
def wonky_coins(n)
arr = []
arr << n/2 << n/3 << n/4
#base case?
if arr.all?{|coin| coin == 0}
return arr.flatten.length
else
arr.map{|x| wonky_coins(x)}
end
end
p wonky_coins(5)
За исключением я [[3,3,3], 3,3] в качестве выхода, если я его карту. Это на самом деле не повторяется, но даже до этого, это дает странный результат, который я не могу для жизни меня понять, почему выход так!
Я знаю, что это потому, что я использую метод карты, потому что я мутирую его, повторяя его снова через wonky_coins, что я получаю этот странный вывод, который я не могу объяснить?
С тех пор я посмотрел на решение и понял, что массивы сделали его излишне сложным, но мне все еще интересно, что здесь происходит?
Это потому, что вы сглаживаете и получаете длину массива в базовом футляре для рекурсивного цикла. Итак, [0,0,0] -> 3 .... И не смог бы последний тест wonky_coins (0) .should == 1 – jmccure