ただいまRubyで再帰を理解しようとしています。(後で追加:順列の列挙(検索用))
でも、途中でで何が起きているのかわからなくなってしまいます。
コード自体が切り貼りで間違っているかもしれません。。おかしな勘違いをしているかもしれません。
よろしければ教えてください。よろしくお願い致します。
Ruby
1def permutation(ary, new_ary = []) 2 p new_ary if ary.length == new_ary.length 3 4 ary.each do |n| 5 next if new_ary.member? n 6 new_ary.push n 7 permutation(ary, new_ary) 8 new_ary.pop 9 end 10end 11 12permutation([1,2,3]) 13結果 14[1, 2, 3] 15[1, 3, 2] 16[2, 1, 3] 17[2, 3, 1] 18[3, 1, 2] 19[3, 2, 1] 20
うまく動いているようです。が、どう動いてこうなるのかを知りたく、
next if p new_ary.member? n と見えるようにして、あと
p new_ary.push n
p new_ary.pop と見えるようにしました。
Ruby
1結果(長くてすみません) 2false 3[1] 4true 5false 6[1, 2] 7true 8true 9false 10[1, 2, 3] 11[1, 2, 3] 12true 13true 14true 153 162 17false 18[1, 3] 19true 20false 21[1, 3, 2] 22[1, 3, 2] 23true 24true 25true 262 27true 283 291 30false 31[2] 32false 33[2, 1] 34true 35true 36false 37[2, 1, 3] 38[2, 1, 3] 39true 40true 41true 423 431 44true 45false 46[2, 3] 47false 48[2, 3, 1] 49[2, 3, 1] 50true 51true 52true 531 54true 55true 563 572 58false 59[3] 60false 61[3, 1] 62true 63false 64[3, 1, 2] 65[3, 1, 2] 66true 67true 68true 692 70true 711 72false 73[3, 2] 74false 75[3, 2, 1] 76[3, 2, 1] 77true 78true 79true 801 81true 82true 832 84true 853 86
これを見ると、最初に引数aryの配列の1番目が、変数new_aryにあるか見て、無いのでnew_aryに代入しています。
次に再帰でメソッドpermutation([1,2,3], [1])を呼んでいるものと理解しています。
2回目のeachで、今度は引数aryの配列の1番目が、変数new_aryにあるので、次のnを評価して、これまたないので、new_aryに2を代入。
次に再帰でメソッドpermutation([1,2,3], [1,2])を呼んでいるものと理解しています。
3回目のeachで、今度は引数aryの配列の1番目も2番目も変数new_aryにあるので、次のnを評価して、new_aryに3を代入。
次に再帰でメソッドpermutation([1,2,3], [1,2,3])を呼んでいるものと理解しています。
そのあとから急にわからなくなってしまいます。表示されている結果は
true
true
true
ここまではまだそうだなあと思えるのですが、次に
3
2
false
[1,3]
となり、もうわからなくなってしまいました。
しまいにはpermutationに再帰するのなら、new_ary.popの出番がないのでは、とも
思うようになってしまいました。頭から湯気が出ています。
もし助けて頂ける方がいらっしゃいましたら、どうぞ、よろしくお願い致します。
回答3件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/04/13 07:55