前提・実現したいこと
rubyを用いて競技プログラミングのような問題を解いています。
再帰関数の中で配列に要素を追加しています。
このときにarray.pushを用いると求めている結果と異なってしまいます。
該当のソースコード
問題の内容は関係ないのですが、簡略化したものを載せます。
・2次元の座標を上下左右のみ指定回数動く。
・同じ場所は通れない。
・12回移動するとき全部で何通りあるか。
ruby
1# num:動く回数, hist:動いた履歴, :cur_pos:現在の場所 2def move(num, hist = [], cur_pos = [0, 0]) 3 hist = [*hist, cur_pos] #これは動く 4 # hist.push(cur_pos) #これは動かない 5 return 0 if hist.count > num + 1 6 return 1 if hist.count == num + 1 7 8 around = [[0, 1], [0, -1], [1, 0], [-1, 0]] 9 10 around.reduce(0) do |acc, ar| 11 next_pos = [cur_pos[0] + ar[0], cur_pos[1] + ar[1]] 12 hist.include?(next_pos) ? acc : acc + move(num, hist, next_pos) 13 end 14end 15 16puts move(12)
試したこと
pushを用いずに配列に追加した場合は期待通りの結果となります。
なぜpushの場合は違うのでしょうか。
参照渡しであることが影響しているのかなとは思うのですがよくわかりません。
また、このコードの中で修正したほうが良い書き方(リファクタリング)があれば教えていただきたいです。
よろしくお願いいたします。
補足情報(FW/ツールのバージョンなど)
ruby v2.5.3
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/01/06 15:36 編集
2019/01/06 15:45
2019/01/07 00:59