2015-02-12 2 views
0

Вот подсказка я был дана:Рекурсия с участием массива для шаткого монета

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,0] -> 3 .... И не смог бы последний тест wonky_coins (0) .should == 1 – jmccure

ответ

0

Вот что Seeing is Believing показывает, как работает код:

def wonky_coins(n) 
    arr = []       # => [], [], [], [], [], [], [] 
    arr << n/2 << n/3 << n/4   # => [2, 1, 1], [1, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0] 
    #base case? 
    if arr.all?{|coin| coin == 0} # => false, false, true, true, true, true, true 
     return arr.flatten.length # => 3, 3, 3, 3, 3 
     else 
     arr.map{|x| wonky_coins(x)} # => [3, 3, 3], [[3, 3, 3], 3, 3] 
    end 
end 

p wonky_coins(5) # => [[3, 3, 3], 3, 3] 

# >> [[3, 3, 3], 3, 3] 

Зрение Верит является отличным инструментом и может помочь выкопать странность в коде.

+0

Это потрясающе !! Спасибо! – ksliu25

+0

Любопытно, что сплющивание кажется шагом, превращающим их в 3-х ... – ksliu25

Смежные вопросы