数组上的递归调用映射?

时间:2013-10-23 09:06:29

标签: ruby

我正在尝试编写一个取值为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!(&amp; generate)但结果是[[2,1,1],[2,1,1],[2,1,1]] 为什么不用新数组替换现有值?

2 个答案:

答案 0 :(得分:0)

当每个生成的元素不是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]]]

答案 1 :(得分: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]]]