2

我正在尝试编写一个方法,该方法接受一个值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!在 all 之前再次调用每个元素(可能是递归)的最佳方法可能是什么coins[i][j] == 0

我尝试调用 coin[0].map!(&generate) 但结果是 [[2, 1, 1], [2, 1, 1], [2, 1, 1]] 为什么它没有替换现有值有一个新的阵列?

4

2 回答 2

1

您只需要在每个生成的元素不为 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]]]
于 2013-10-23T16:34:25.770 回答
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]]]
于 2013-10-24T00:54:06.230 回答