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

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

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

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

Q&A

解決済

3回答

2124閲覧

再帰関数

manman

総合スコア233

Ruby

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

0グッド

0クリップ

投稿2014/11/15 03:58

再帰関数を使ったコードについて質問です。

lang

1def search( ) 2 (中略) 3 ある作業をする 4 search(次) # 次を探索 5 作業をする前の状態に戻す 6 (中略) 7end

「作業をする前の状態に戻す」という処理を入れるような例は
よくあるのでしょうか?

例えば、こんなパターンがあります。

lang

1def search( ) # 次のステップに進むのに、2つの場合分けがある 2 (中略) 3 場合1の作業をする 4 search(次) # 次を探索 5 作業をする前の状態に戻す 6 (中略) 7 場合2の作業をする 8 search(次) # 次を探索 9 作業をする前の状態に戻す 10 (中略) 11end

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

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

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

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

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

guest

回答3

0

ベストアンサー

「作業をする前の状態に戻す」 ような処理を再帰でやるかといわれると、やりません。

それ以前に、再帰自体をまず使いません
これは、再帰は流れが追いづらく分かりにくくなりがちなのと、言語にもよりますが、メモリーの消費が多くなってしまうためです。使うのはよほどの場合で、数列や木構造のように再帰で書いた方がずっとわかりやすくなるといった時だけです。
再帰で複雑な処理をやろうとしているのであれば、おそらく、わかりにくいコードになるはずです。

原理的には再帰処理は必ずループで書くことができます。また、 Ruby では yield とブロックもあります。
具体的にどういったことがしたいのかよくわからないのですが、ブロックで書いた方が分かりやすくなるケースのような気はします。

投稿2014/11/15 18:15

yohshiy

総合スコア863

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

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

0

再帰処理の中で起こる副作用を無しにしてしまう という例は稀だと思います。

なぜなら、
トップレベルで呼び出した このメソッドの実行前後で何も副作用が残らない
とすると
このメソッドを呼び出す意味がないことになりますから。
(stdout やログ出力のような 「作業をする前の状態に戻す事が困難な事」の痕跡を残すことしかできないことになります。)

私が質問の意図を理解できていないのかもしれません。

投稿2014/11/15 11:50

katoy

総合スコア22324

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

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

manman

2014/11/15 12:29

場合分けがあるcaseを質問分に追加しましたので、このようなcaseはどうでしょうか?
guest

0

質問の意図が不明ですが、

lang

1def foo(arg) 2 中略 3 foo(xxx) 4 中略 5end

は、再帰の典型というか、再帰の定義です。

「作業をする前の状態に戻す」という処理を入れるのが再帰の典型かという意図の質問であれば、典型ではありません。

投稿2014/11/15 11:11

otn

総合スコア84499

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

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

manman

2014/11/15 11:35

質問の仕方がまずかったので、修正しました。
otn

2014/11/15 22:03

具体的なコードでないと、抽象的すぎて、アドバイス不可能です。 書かれたレベルの抽象的な一般論で言うと、「作業をする前の状態に戻す」という処理を入れるような例は、まず無いと思います。 アドバイスが欲しければ、コードを載せて、「もっとわかりやすい書き方はないか?」という風な質問を改めてしてください。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問