(define)なしで再帰関数を定義する

1,401 views

Published on

関数型LT▽たいかい

Published in: Technology
0 Comments
5 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
1,401
On SlideShare
0
From Embeds
0
Number of Embeds
371
Actions
Shares
0
Downloads
5
Comments
0
Likes
5
Embeds 0
No embeds

No notes for slide

(define)なしで再帰関数を定義する

  1. 1. (define)を使わずに再帰関数を書く 関数型LT大会 #functionalLT 2014-05-11 @ クックパッド κeen(@blackenedgold)
  2. 2. 自己紹介 ● Twitter: κeen(@blackenedgold) ● Github: KeenS ● ブログ: κeenのHappy Hacκing Blog (KeenS.github.io) ● Shibuya.lispにいます ● 東大数学科の4年生 ● Lisp, Ruby, OCaml, シェルスクリプトなど
  3. 3. そろそろ終盤ですね。 皆さんお疲れ様です。 私はそんなに恐い話はしないので 気楽に聴いて下さい
  4. 4. 突然ですが 再帰関数書けますか?
  5. 5. (define fact (lambda (n) (if (= 0 n) 1 (* n (fact (- n 1))))))
  6. 6. defineなしだと?
  7. 7. ( fact (lambda (n) (if (= 0 n) 1 (* n (fact (- n 1)))))) …つらい
  8. 8. もうちょっと言うと lambda, if, +, -, *, = だけで書いてみて下さい
  9. 9. (define var value) ≒ (let ((var value)) …) ≒ ((lambda (var) …) value) ところ で 一番下のやつはJavaScriptでは良く使いますね
  10. 10. ((lambda (fact) (lambda (n) (if (= 0 n) 1 (* n (fact (- n 1)))))) □□□) 置き換えてみ る
  11. 11. ((lambda (fact) (lambda (n) (if (= 0 n) 1 (* n (fact (- n 1)))))) □□□) ここに入るもの 置き換えてみ る
  12. 12. (lambda (n) (if (= 0 n) 1 (* n (fact (- n 1))))) もちろん、fact本 体。
  13. 13. (lambda (n) (if (= 0 n) 1 (* n (fact (- n 1))))) もちろん、fact本 体。 あ れ?
  14. 14. ((lambda (fact) (lambda (n) (if (= 0 n) 1 (* n (fact (- n 1)))))) □□□) でも何かしらの値を与えれ ば本体は取り出せる
  15. 15. ((lambda (fact) (lambda (n) (if (= 0 n) 1 (* n (fact (- n 1)))))) □□□) ここに入るもの でも何かしらの値を与えれ ば本体は取り出せる
  16. 16. またfact …本体が必要になったぞ ? (再帰関数だから当たり前)
  17. 17. 一旦状況を整理しよう
  18. 18. ((lambda (fact) (lambda (n) (if (= 0 n) 1 (* n (fact (- n 1)))))) □□□) ここに入るもの 元々の問題
  19. 19. (lambda (fact) (lambda (n) (if (= 0 n) 1 (* n (fact (- n 1)))))) = f とおく と
  20. 20. (lambda (fact) (lambda (n) (if (= 0 n) 1 (* n (fact (- n 1)))))) = f とおく と Fact = (f □□□)
  21. 21. (lambda (fact) (lambda (n) (if (= 0 n) 1 (* n (fact (- n 1)))))) = f とおく と Fact = (f □□□) □□□ = (f □□□)
  22. 22. (lambda (fact) (lambda (n) (if (= 0 n) 1 (* n (fact (- n 1)))))) = f とおく と Fact = (f □□□) □□□ = (f □□□)
  23. 23. つまり (f (f (f … )))
  24. 24. つまり (f (f (f … ))) 無限回適用 あ、fは 「1引数を取って1引数関数を返す関 数」 ってのを覚えておいて下さい
  25. 25. ((lambda (x) (x x)) (lambda (x) (x x))) ところで このquin知ってますか?
  26. 26. ((lambda (x) (x x)) (lambda (x) (x x))) ところで このquin知ってますか?
  27. 27. ((lambda (x) (x x)) (lambda (x) (x x))) ところで このquin知ってますか? 無限ループが起きる
  28. 28. (lambda (f) ((lambda (x) (f (x x))) (lambda (x) (f (x x))))) ”うまいこと無限ループの エンジン” に関数適用を乗せてみる (f (f (f … (f (x x))...)))
  29. 29. ”でもまだ エンジン”が暴走するので thunkで包んであげる
  30. 30. (lambda (f) ((lambda (x) (f (lambda () (x x)))) (lambda (x) (f (lambda () (x x))))))
  31. 31. ところでfは 「1引数を取って1引数関数を返す関数」 でした。
  32. 32. 引数のnを与えましょう
  33. 33. (lambda (f) ((lambda (x) (f (lambda (n) ((x x) n))) (lambda (x) (f (lambda (n) ((x x) n)))))) 完成!
  34. 34. ((lambda (f) ((lambda (x) (f (lambda (n) ((x x) n)))) (lambda (x) (f (lambda (n) ((x x) n)))))) (lambda (fact) (lambda (n) (if (= 0 n) 1 (* n (fact (- n 1))))))) 全体図
  35. 35. (((lambda (f) ((lambda (x) (f (lambda (n) ((x x) n)))) (lambda (x) (f (lambda (n) ((x x) n)))))) (lambda (fact) (lambda (n) (if (= 0 n) 1 (* n (fact (- n 1))))))) 10) * * * * * * * => 3628800 遊んでみる (picrinで実行)
  36. 36. 今日のキーワード ● λ計算 ● ω関数 ● 不動点コンビネータ ● Thunk ● Scheme ● Picrin ● Lisp ● Shibuya.lisp
  37. 37. 以上 質問あればどうぞ
  38. 38. Shibuya.lispについてちょっと宣伝 ● 毎月の下旬に開催されるLTスタイルの勉強会 ● 一応Common Lisp回、Scheme回、Clojure回が ある ● でもLispに関係してればなんでもOK ● 今月はScheme回 ● 今回は処理系実装者が数名(1人以上)来るよ うです

×