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

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

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

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

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Q&A

解決済

3回答

3936閲覧

再帰関数を呼び出した時の階層の深さを知りたい

bouyomisan

総合スコア87

Ruby

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

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

0グッド

1クリップ

投稿2017/07/19 06:42

編集2017/07/19 07:31

ruby

1 2def each_with_puts(ary) 3 ary.each do |v| 4 p v 5 if v.class == Array 6 each_with_puts (v) 7 end 8 end 9end 10 11ary = [ 12 [1,2], 13 [3,4,5], 14 [ 15 [6,7], 16 [8] 17 ] 18] 19each_with_puts ary 20 21# 実行結果 22#pry(main)> load 'sample.rb' 23#[1, 2] 24#1 25#2 26#[3, 4, 5] 27#3 28#4 29#5 30#[[6, 7], [8]] 31#[6, 7] 32#6 33#7 34#[8] 35#8 36#=> true

このように再帰関数を使って、配列の要素を分解する関数があります。
そこで今何層目の配列を処理しているのか知りたいです。

例えば [1,2] を処理している時は 2層目、[[6,7], 8]も2層目、[6,7] は3層目というような感じです。

処理の間に count という変数を入れて、 each の前後に count+= 1 として見ましたが、それだと数字がリセットされませんでした。

===========追記

回答ありがとうございます。
教えていただいた方法を試して見ましたが、ダメでした。。
どんどん数が足されて行ってしまいました。
同じ層は固定したいのですが、うまい方法はありませんでしょうか?

ruby

1def each_with_puts(ary,layer) 2 ary.each do |v| 3 p v 4 layer += 1 5 p "現在の階層は" + layer.to_s 6 if v.class == Array 7 each_with_puts(v,layer) 8 end 9 end 10end 11 12ary = [[1,2],[3,4,5],[[6,7],[8,[2323, [2,32,2], 43]]]] 13each_with_puts ary, 1 14 15#pry(main)> load 'sample.rb' 16#[1, 2] 17#"現在の階層は2" 18#1 19#"現在の階層は3" 20#2 21#"現在の階層は4" 22#[3, 4, 5] 23#"現在の階層は3" 24#3 25#"現在の階層は4" 26#4 27#"現在の階層は5" 28#5 29#"現在の階層は6"

実現したい形はこんな感じです

#pry(main)> load 'sample.rb' #[1, 2] #"現在の階層は3" #1 #"現在の階層は3" #2 #"現在の階層は2" #[3, 4, 5] #"現在の階層は3" #3 #"現在の階層は3" #4 #"現在の階層は3" #5 #"現在の階層は3"

====再追記

ruby

1pry(main)> load 'sample.rb' 2[1, 2] 31 42 5"現在の階層は1" 6[3, 4, 5] 73 84 95 10"現在の階層は2" 11[[6, 7], [8]] 12[6, 7] 136 147 15"現在の階層は3" 16[8] 178 18"現在の階層は4" 19"現在の階層は3" 20

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

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

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

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

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

guest

回答3

0

グローバル変数をカウンタに使えばどうでしょうか。

投稿2017/07/19 06:54

moonphase

総合スコア6621

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

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

0

ベストアンサー

Ruby

1def each_with_puts(ary , depth) 2 ary.each do |v| 3 p v 4 if v.class == Array 5 each_with_puts (v , depth + 1) 6 end 7 end 8end 9 10 11each_with_puts ary 1

Rubyの構文知らないので表記がめちゃくちゃだったらごめんなさい。
要するに、初期値1だか0だかを引数として与えて、深く呼び出すごとに1増やす、ということをすればいいのです。
適当なところにdepthを出力するコードを入れて下さい。

投稿2017/07/19 06:52

zohnam

総合スコア1441

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

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

bouyomisan

2017/07/19 07:16

ありがとうございました。 やって見たのですが、どんどん数字が増えていってしまいました。 追記を書きましたので、よろしくお願いします
zohnam

2017/07/19 07:23

私のやり方でやってみました? kiichi54321さんのと私のは、似てるようでちょっと違いますよ。
bouyomisan

2017/07/19 07:32

あれ?すみません、同じものだと勘違いしていました。早速試して見ます!
bouyomisan

2017/07/19 07:35

できました! すごいです、こんなやり方があるのですね! 言われてみれば、階層の深さとはこの each_with_puts を呼び出した回数と同じ意味ですから、引数に +1 したものを入れるというのは納得です ありがとうございました!
guest

0

def each_with_puts(ary,layer) ary.each do |v| p v layer += 1 if v.class == Array each_with_puts (v,layer) end end end

こんな感じで、階層も伝搬させる。

投稿2017/07/19 06:52

kiichi54321

総合スコア1984

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

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

bouyomisan

2017/07/19 07:16

ありがとうございました。 やって見たのですが、どんどん数字が増えていってしまいました。 追記を書きましたので、よろしくお願いします
kiichi54321

2017/07/19 07:19

layer += 1 p "現在の階層は" + layer.to_s をary.eachの前に持ってきてはどうですか?
bouyomisan

2017/07/19 07:31

増えてしまいました・・
bouyomisan

2017/07/19 07:36

zohnam さんのやり方でできていました!ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問