ページ 11

再帰プログラム

Posted: 2008年12月12日(金) 15:21
by そねっと
えー聞くところが場違いかも知れませんが 教えてください。

再帰プログラムでメインクラス以外に2つ以上のクラスを再帰を用いたプログラムを作りなさい。

という問題が出たのですが・・・再帰プラグラムじたいが理解不能で・・・

どういうプログラムがありますか?C#です。

ご迷惑をおかけしますがよろしくお願いします

Re:再帰プログラム

Posted: 2008年12月12日(金) 17:01
by バグ
参考書なんかには、階乗の計算に使われていたりしますね。
私は落ち物パズルの消去判定(同じ色が何個隣接しているか?とか)に使ったりしますけど…

Re:再帰プログラム

Posted: 2008年12月12日(金) 20:17
by non
再帰で有名なのはハノイの塔ですよね。
円盤と、棒で2つはクラスが作れるかな。3つとなるとね。何を作ろう。
他には順列・組み合わせ、最大公約数、マージソート、クイックソートなど。

迷路の探索に使ったこともあります。最近使ったのは、マインスイーパーを作った
ときに、クリックしたときに周辺部の所がいっぺんに開く部分です。
バグさんの隣接している色を調べるのと同じ方法ですね。たぶん。

Re:再帰プログラム

Posted: 2008年12月12日(金) 20:31
by ななし
2つ以上のクラスを使った再帰は、ファイルとディレクトリの構造を辿る際によく使用されますね。

Visitor パターンで検索すると、それなりに情報が出てくると思います。

ダブルディスパッチなんかも、2つ以上のクラスを使った再帰になるのかな?ちょっと自信ないです。

Re:再帰プログラム

Posted: 2008年12月13日(土) 02:07
by d@初心者
冗長かもしれませんが。至極簡単に言えば
階乗の計算のとき使うとは

n>1のとき
F(n)=n*F(n-1) ----(ⅰ)
n=1のとき
F(1)=1

(i)の式で引数nで渡されたものを引数(n-1)にしてもう一回同じ処理をするために自分を呼びます
F(n)=n*{F(n-1)=(n-1)*F(n-2)}
ってな感じで自分を何回も呼んだあとに、nが1になったらnの階乗の出来上がりです。
値が収束するまで同じ関数を繰り返すときに使うかな?
クイックソートぐらいでしか使ったことないからなぁ・・・
考え方はこんな感じですればいいかと思うんですが



2つを使った・・・・再帰って無理に作るものじゃない気もしますけど、こういうのを考えるのも楽しいでしょうからがんばってください^^

Re:再帰プログラム

Posted: 2008年12月13日(土) 22:42
by lbfuvab
素因数分解にもつかえそうですね。

Re:再帰プログラム

Posted: 2008年12月18日(木) 16:53
by そねっと
C#で、再帰プログラムを使用して、クラスを3つ使用して8クイーンプログラムを作りたいのですが、プログラムガ全然わからないので(構文)教えてもらえますでしょうか?

Re:再帰プログラム

Posted: 2008年12月18日(木) 17:05
by バグ
クラスを3つ指定されていますが、どのような振り分けになりますか?
なんでもいいので、クラスを3つ使用すればいいのでしょうか?
もっと仕様を明確にしてください。

Re:再帰プログラム

Posted: 2008年12月18日(木) 17:17
by そねっと
ご返事ありがとうございます。
何でもいいので クラスを3つ使用しているプログラムで大丈夫です。

・再帰を使用していること。
・なんでもいいので、クラスを3つしようしていること。
・C#で開発されていること。

くらいです。初心者で大変わかりにくい内容かとはございますが、よろしくお願いします。

Re:再帰プログラム

Posted: 2008年12月18日(木) 17:38
by dic
再帰呼び出しの方法は簡単です。しかし、これでは問題があります。この関数を呼び出すと、プログラムはそのうち停止してしまいます。なぜなら、関数呼び出しが永遠に続いてしまうからです。つまり、最初のfunc関数の中で、次のfunc関数を呼び出し、さらに次のfunc関数を・・・のようになってしまうのです。

Re:再帰プログラム

Posted: 2008年12月18日(木) 20:57
by たいちう
8クイーンについては、C言語ですが再帰の解説があります。
本来「再帰関数」というのは手段であって目的ではありません。
しかし学習者にとっては「再帰関数の学習」が目的であることが多く、
そのような例題ばかり見かけます。
その点、このページは手段としての「再帰関数」を扱っているといえるでしょう。
(8クイーンについては再帰関数を使う必然は無いと思いますが)

Cパズルプログラミング-再帰編
http://karetta.jp/book-cover/cpuzzle-recursion


同様に「クラス」というのも手段です。
オブジェクト指向の恩恵を受けられない規模のプログラムで
オブジェクト指向の学習をするというのは困難だと思います。
(教わる人も教える人も)

まず、クラスを意識しないでプログラムを完成させてから、
プログラムをここに載せれば、どの部分をクラス化すると良いか、
アドバイスが得られるのではないでしょうか。

Re:再帰プログラム

Posted: 2008年12月18日(木) 23:52
by そねっと
こんばんは。

皆さん 本当にありがとうございます。

無事 解決できました。