2013-10-23 113 views
1

我正在嘗試編寫一個值爲N的方法,並返回三個整數N/2N/3N/4向下舍入。它一直把它們取回,直到只有零。數組上的遞歸調用映射?

def crazy_coins(n) 
    coins = Array.new 
    coins.push(n.to_a) 
    generate = Proc.new { |x| 
    temp = [] 
    count = 2 
    while count < 5 
     x = n/count 
     temp << x 
     count += 1  
    end 
    return temp 
    } 
    coins.map!(&generate) 
end 

輸出:

crazy_coins(5) 
# => [[2, 1, 1]] 

成功輸出應該類似於:

crazy_coins(5) 

11 
=> [2, 1, 1] 
=> [[1, 0, 0], [0, 0, 0], [0, 0, 0]] 
=> [[[0, 0, 0], 0, 0], [0, 0, 0], [0, 0, 0]] 

什麼可能是每個元素再次調用coins.map!(遞歸也許),直到所有coins[i][j] == 0的最佳方式?

我試圖調用硬幣[0] .MAP!(&生成),但結果爲[[2,1,1],[2,1,1],[2,1,1]] 爲什麼它不會用新數組替換現有值?

+1

你明白了 - 在一個進程中'return'聲明將在其中PROC被稱爲上下文返回,而不僅僅是PROC本身。實際上你根本不需要顯式的return語句 - 只要把'temp'作爲proc中的最後一個語句,它就會被返回。 –

+0

好的謝謝,這是可行的,但當試圖調用硬幣[0] .map!(&生成)嘗試替換[[2,1,1]]值時,結果爲[[2,1,1], [2,1,1],[2,1,1]] ..怎麼來的地圖!是不是用一個新的數組替換單個值? – rogueSF

+1

地圖!是一種改變接收器的方法。這並不意味着要返回一個新的數組。 – vgoff

回答

0

只需在每個生成的元素不遞歸時遞歸。另外,嘗試避免在集合組合可用時進行迭代。

def divisors(n) 
    (2..4).map { |d| n/d } 
end 

def crazy_coins(a) 
    Array(a).map { |e| e != 0 ? crazy_coins(divisors(e)) : e } 
end 

crazy_coins(5) 
=> [[[[0, 0, 0], 0, 0], [0, 0, 0], [0, 0, 0]]] 
crazy_coins(11) 
=> [[[[[0, 0, 0], 0, 0], [0, 0, 0], [0, 0, 0]], [[0, 0, 0], [0, 0, 0], 0], [[0, 0, 0], 0, 0]]] 
+0

啊我明白了,太簡單了!謝謝您的幫助 :) – rogueSF

0

感謝dbenhur我能夠完成的問題... dbenhur向我展示了遞歸,但我的程序的最終結果是返回的零代幣的最終金額,但我不能使它與工作兩種方法...

解決方案:

def crazy_coins(n) 
    return 1 if n == 0 

     # Recursive 
    return crazy_coins(n/2) + crazy_coins(n/3) + crazy_coins(n/4) 
end 

crazy_coins(5) 
=> 11 
=> [[[[0, 0, 0], 0, 0], [0, 0, 0], [0, 0, 0]]]