DEV Community

kaede
kaede

Posted on

Clojure Tutorial Part 3 -- 関数とループ

参考

https://clojure.org/guides/repl/basic_usage#_evaluating_clojure_expressions

Clojure 公式


1 を足す add 関数を作成する

まずは Clojure の関数の使い方をまとめる

( defn add [n]
  ( + n 1 )
)
Enter fullscreen mode Exit fullscreen mode

JavaScript と比較すると

  • 関数宣言は function ではなく defn
  • 引数は () ではなく [] で括る
  • 処理は {} ではなく () で括る

これらが違う。

#'user/add
user=> ( add 1 )
2
Enter fullscreen mode Exit fullscreen mode

宣言の () を閉じると
現在地に関数が作成された表示がされる

そして普通に使用できる。


サンプルの階乗コードを実行して分析する

https://clojure.org/guides/repl/basic_usage#_evaluating_clojure_expressions

サンプルのコードを作成

(defn factorial [n]
(if (= n 0)
  1
  (* n (factorial (dec n))))
)

#'user/factorial
Enter fullscreen mode Exit fullscreen mode

factorial は階乗という意味。

中身は下記の通り。

結論 n x (n-1) だが

引数 n が 0 であれば n を 1 にする
引数 n-1 した数値で上記の

引数 n が 0 であれば n を 1 にする

この処理を行い
その後 引数 n-1 を n にかける。


実際に数値を入れた場合の解説

user=> ( factorial 0 )
1
user=> ( factorial 1 )
1
user=> ( factorial 2 )
2
user=> ( factorial 3 )
6
user=> ( factorial 4 )
24
Enter fullscreen mode Exit fullscreen mode

0 の場合

n が 0 なので 1 に変更
n-1 も 0 なので 1 に変更
1 x 1 = 1

1 の場合

n は 1 なのでそのまま
n-1 が 0 なので 1 に変更
1 x 1 = 1

さらに 0 の場合を繰り返し、無限ループを検知して止まる

2 の場合

n は 2 なのでそのまま
n-1 が 1 なのでそのまま
2 x 1 = 2

さらに 1 と 0 の場合を繰り返し、無限ループを検知して止まる

3 の場合

n は 3
n-1 が 2
3 x 2 = 6

2 の場合以降も繰り返して
3 x 2 x 1 x 1 となり終了する。

4 以降は自明。


https://www.javadrive.jp/javascript/function/index15.html

JS でもお馴染みの再起呼び出しを使っていた。

毎回 再帰 って書くと佐伯さんが出てくる、
さえき さんじゃなかったのか

これが REPL -- Read, Exe, Print, Loop の Loop らしい。


まとめ

Clojure は JS の
function, (), {},
これらの代わりに
defn, [], (),
これらを使うが、 JS と同じように関数を作れる

関数の後半に自身を呼び出すことで、
前半までの処理を動かした結果を計算に含める事ができる。

Latest comments (0)