ruby
1ary = ... 2(1..n).each{|i| 3 (1..n).each{|j| 4 ... 5 (1..n).each{|m| 6 ary[i * j * ... * m] += 1 7 } 8 ... 9 } 10} 11p ary
上記のようなeach の入れ子を再帰で書くことはできますか?
(再帰でなくても、入れ子を回避する方法があれば教えてください。)
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答3件
0
ベストアンサー
参考情報
- ループを再帰関数にする考え方
http://qiita.com/ozwk/items/4ffdba8e83df1171ac39
この方法で、ループを再帰で書いてみました。
r.rb
ruby
1def do_loop(ary, n) 2 (1..n).each { |i| 3 (1..n).each { |j| 4 (1..n).each { |k| 5 x = i * j * k 6 ary[x] = 0 if ary[x].nil? 7 ary[x] += 1 8 } 9 } 10 } 11 ary 12end 13 14def next_ids(ids, n) 15 ids.each_with_index do |x, index| 16 if x < n 17 ids[index] += 1 18 return ids 19 end 20 21 (index..(ids.size - 1)).each do |x2| 22 next if ids[x2] == n 23 ids[x2] += 1 24 (0..x2 - 1).each { |p| ids[p] = 1 } 25 return ids 26 end 27 end 28 nil 29end 30 31def func(ids) 32 x = ids.reduce(:*) 33 @ary[x] = 0 if @ary[x].nil? 34 @ary[x] += 1 35end 36 37def rec_func(ids, n) 38 # p ids 39 func(ids) 40 ids = next_ids(ids, n) 41 return if ids.nil? 42 rec_func(ids, n) 43end 44 45@ary = [] 46rec_func([1, 1, 1], 3) 47p @ary 48 49p do_loop([], 3) 50
投稿2017/05/29 22:11
総合スコア22322
0
repeated_combinationを使えばシンプルに書けますね。 <=間違いでした。
(追記)
h_aさんの指摘で間違いに気づきました。失礼しました。
正解はrepeated_permutation でした。
(追記おしまい)
ruby
1 2ary = {} # ary=[] でも好きな方で 3 4n = 10 # (1..10) 5m = 10 # [a * b * c * d * e * f * g * h * i * j] 6 7(1..n).to_a.repeated_permutation(m){|comb| 8 9 index = comb.reduce(:*) 10 ary[index] = 0 if ary[index].nil? 11 ary[index] += 1 12 13} 14 15p ary 16 17
投稿2017/05/29 16:38
編集2017/05/29 17:03総合スコア1895
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
Ruby
1# encoding: utf-8 2 3m = 4 4n = 3 5 6array = ([(1..n).to_a] * m) # array = [[1, 2, 3], [1, 2]]等もいける。 7 8tmp = array.shift 9 10array.each do |element| 11 tmp = tmp.product(element) 12end 13 14tmp.map!(&:flatten) 15 16tmp.each do |e| 17 puts "#{e} => #{e.reduce(:*)}" 18end
再帰ではないですが、考えてみました。
恐らく「i * j * ... * m」この部分のすべての組み合わせを
作れていると思います。
(私は数学が得意ではないのでよく分かっていません。)
repeated_combinationを使う方法と私の方法では結果が若干異なります。
Ruby
1# encoding: utf-8 2 3m = 2 4n = 2 5 6array = ([(1..n).to_a] * m) 7 8tmp = array.shift 9 10array.each do |element| 11 tmp = tmp.product(element) 12end 13 14tmp.map!(&:flatten) 15 16tmp.each do |e| 17 puts "#{e} => #{e.reduce(:*)}" 18end
[1, 1] => 1 [1, 2] => 2 [2, 1] => 2 [2, 2] => 4
Ruby
1# encoding: utf-8 2 3n = 2 4m = 2 5 6(1..n).to_a.repeated_combination(m){|comb| 7 p comb 8} 9
[1, 1] [1, 2] [2, 2]
Ruby
1# encoding: utf-8 2 3(1..2).each do |i| 4 (1..2).each do |j| 5 p [i, j] 6 end 7end 8
[1, 1] [1, 2] [2, 1] [2, 2]
投稿2017/05/29 14:10
編集2017/05/29 23:30退会済みユーザー
総合スコア0
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。