私が解決しようとしている問題は次のとおりです。
n ドルが与えられた場合、無制限のペニー、ニッケル、ダイム、クォーターがあり、n を表す方法の総数を計算します。
私は再帰的な解決策を思いつきました(nが0.25ドルであると仮定して、出力はばかげた数値ではありません):
def changes(w, x, y, z)
if 0.01 * w + 0.05 * x + 0.1 * y + 0.25 * z > 0.25
return
elsif 0.01 * w + 0.05 * x + 0.1 * y + 0.25 * z == 0.25
@@counter += 1
puts "w: #{w} x: #{x} y: #{y} z: #{z}"
else
changes(w + 1, x, y, z)
changes(w, x + 1, y, z)
changes(w, x, y + 1, z)
changes(w, x, y, z + 1)
end
end
@@counter = 0
changes(0, 0, 0, 0)
puts @@counter
基本的に、ここでの考え方は、一致した場合にカウンターをインクリメントし、そうでない場合は次の可能な金種を試すことです。
しかし、出力には次のような繰り返しがたくさんあります。
w: 15 x: 0 y: 1 z: 0
w: 15 x: 0 y: 1 z: 0
w: 15 x: 0 y: 1 z: 0
w: 15 x: 0 y: 1 z: 0
w: 15 x: 0 y: 1 z: 0
w: 10 x: 1 y: 1 z: 0
w: 15 x: 0 y: 1 z: 0
w: 10 x: 1 y: 1 z: 0
誰かが理由を教えてもらえますか? 私の再帰では、常に異なる値のパラメーターを渡しませんか? 同じ値が複数回出力されるのはなぜですか?
ありがとうございました。