質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.51%
Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Q&A

解決済

3回答

2695閲覧

each の入れ子を再帰で書けますか?

manman

総合スコア233

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

1グッド

1クリップ

投稿2017/05/29 12:40

編集2017/05/29 14:19

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 の入れ子を再帰で書くことはできますか?
(再帰でなくても、入れ子を回避する方法があれば教えてください。)

Lichtenstein👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答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

katoy

総合スコア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
oskbt

総合スコア1895

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2017/05/29 23:15

勉強になります。
guest

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

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.51%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問