2011年6月10日金曜日

Scalaのきほんのき(再帰関数だよぉ)

だんだん難しいことになってまいりましたが、nouzui2007の頭がついていける範囲でがんばってみたいと思います。

再帰関数は、自分自身を呼び出す関係です。
って、わかるかー
ちゃぶ台があったら、ひっくりかえしたい気分です。

とりあえず、サンプル見てちょうだい。
有名なところで、1~100まで足す問題を解いてみたいと思います。
あ、これって、そろばんの準備運動でもやるみたいです。

nouzui2007的に一番簡単なのは、ループでまわして加算する方法なので、まずはそのサンプル
scala> var total = 0
total: Int = 0

scala> for (i <- 1 to 100) {
     | total += i
     | }

scala> total
res28: Int = 5050

これを、本日のお題で書き直し
なんか、大喜利みたいです。
scala> def Recursive(n: Int): Int = n match {
     | case 1 => 1
     | case _ => n + Recursive(n - 1)
     | }
Recursive: (n: Int)Int

scala> Recursive(100)
res29: Int = 5050

今日は、こっから解説です。
・・・大丈夫かなぁ?

大事なことを忘れないうちに言っておきますが、
戻り値の指定は、絶対に必要です。

このサンプルの処理は、こんな感じで動いています、とゆーのを感じてください

  • 引数100がきたら、デフォルトにマッチするので、その処理を行う
  • マッチした処理では、引数100から1を減算したものを引数に渡して、自分自身を呼び出している
  • 今度は、引数99で来るので、やっぱりデフォルトにマッチ
  • 引数99から1減算して、また自分を呼び出す
  • ・・・って順番で2まで処理すると、自分自身への引数が1になる
  • 引数が1だったら、なにも足さないので、1を返す
  • 引数が2だったら、1が戻ってくるので、引数の2と戻り値の1を加算する
  • 引数が3だったら、3が戻ってくるので、引数の3と戻り値の3を加算する
  • ・・・100まで、繰り返し
わかる?
がんばってみましたが、いかがでしょうか。nousui2007はもうだめです。
また今度。

0 件のコメント:

コメントを投稿