黄金比 . 再帰 Lispで再帰と言えば fact, fib 黄金比は見つからないので考えた 『 Scheme 手習い』読書会 #2 LT @manozo 15 AUG 2011
黄金比 1:1.618033988749894848 <ul><li>A4の紙を2つに折ってA5 </li></ul><ul><li>A5の紙を2つに折ってA6 </li></ul><ul><li>相似 </li></ul>
電 卓 <ul><li>(/ (+ 1 (sqrt 5)) 2) </li></ul><ul><li>1.618034 </li></ul><ul><li>これでは, つまらない </li></ul>
連分数 じーと見ていると再帰が使えそう (+ 1 (/ (+ 1 (/ (+ 1 (/ (+ 1 (/   (+ 1 (/        1.0) ))))))))) 1.625  ;;  再帰はお尻から
gaucheで黄金比  <ul><li>(define gold </li></ul><ul><li>(lambda (n) </li></ul><ul><li>(cond </li></ul><ul><li>((zero? n) 1) </l...
もうひとつ <ul><li>(sqrt (+ 1 </li></ul><ul><li>(sqrt (+ 1 </li></ul><ul><li>(sqrt (+ 1 </li></ul><ul><li>(sqrt (+ 1 </li></ul>...
factも同様に考えると 1    1) )))) 0 1 (* 1  1) 1 2 (* 2  1) 2 6 (* 3  2) 3 24 (* 4  6) 4 120 (* 5  24) 5 値 (fact 5) n 再 帰 (zero? n...
おまけ 白金比, 青銅比 xyzzy で <ul><li>;; 白金比 </li></ul><ul><li>(defun pt (n) </li></ul><ul><li>(cond </li></ul><ul><li>((zerop n) 1...
 3.14159  26535 89793 23846... <ul><li>(defun pi (n) </li></ul><ul><li>(pi1 (remove-if 'evenp (iota n)))) </li></ul><ul><...
 gauche 3.14159 26535 89793   23846... <ul><li>(define pi </li></ul><ul><li>(lambda (n) </li></ul><ul><li>(pi1 (remove e...
 gauche 2  改造 3.14159 26535 89793   23846... <ul><li>(define pi1 </li></ul><ul><li>(lambda (l)  ; l:(1 3 5 7 9...) 奇数のリス...
これから  再帰  を考えた 連分数はまさに再帰? <ul><li>(+ 3 (/ (* 1 1) </li></ul><ul><li>(+ 6 (/ (* 3 3) </li></ul><ul><li>(+ 6 (/ (* 5 5) </li...
まとめ <ul><li>連分数は再帰的? </li></ul><ul><li>再帰はワンライナー生成器? </li></ul><ul><ul><li>つまり出口は一つ </li></ul></ul>
参 考 <ul><li>xyzzy(win)でscheme-mode(gauche)使用 </li></ul><ul><li>連分数 wiki </li></ul><ul><li>http://ja.wikipedia.org/wiki/%E9...
Upcoming SlideShare
Loading in …5
×

黄金比.再帰

1,217 views

Published on

0 Comments
1 Like
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
1,217
On SlideShare
0
From Embeds
0
Number of Embeds
3
Actions
Shares
0
Downloads
4
Comments
0
Likes
1
Embeds 0
No embeds

No notes for slide

黄金比.再帰

  1. 1. 黄金比 . 再帰 Lispで再帰と言えば fact, fib 黄金比は見つからないので考えた 『 Scheme 手習い』読書会 #2 LT @manozo 15 AUG 2011
  2. 2. 黄金比 1:1.618033988749894848 <ul><li>A4の紙を2つに折ってA5 </li></ul><ul><li>A5の紙を2つに折ってA6 </li></ul><ul><li>相似 </li></ul>
  3. 3. 電 卓 <ul><li>(/ (+ 1 (sqrt 5)) 2) </li></ul><ul><li>1.618034 </li></ul><ul><li>これでは, つまらない </li></ul>
  4. 4. 連分数 じーと見ていると再帰が使えそう (+ 1 (/ (+ 1 (/ (+ 1 (/ (+ 1 (/ (+ 1 (/        1.0) ))))))))) 1.625 ;; 再帰はお尻から
  5. 5. gaucheで黄金比 <ul><li>(define gold </li></ul><ul><li>(lambda (n) </li></ul><ul><li>(cond </li></ul><ul><li>((zero? n) 1) </li></ul><ul><li>(else </li></ul><ul><li>       (+ 1 (/. </li></ul><ul><li>           (gold (- n 1)))))))) </li></ul><ul><li>(gold 100) </li></ul><ul><li>gosh> 1.61803398874989 5 </li></ul><ul><li>(/ (+ 1 (sqrt 5)) 2); 1.61803398874989 4848 </li></ul>
  6. 6. もうひとつ <ul><li>(sqrt (+ 1 </li></ul><ul><li>(sqrt (+ 1 </li></ul><ul><li>(sqrt (+ 1 </li></ul><ul><li>(sqrt (+ 1 </li></ul><ul><li>(sqrt (+ 1 </li></ul><ul><li>(sqrt (+ 1 </li></ul><ul><li>            1)))))))))))) ; さて再帰でどう書く? </li></ul>
  7. 7. factも同様に考えると 1    1) )))) 0 1 (* 1 1) 1 2 (* 2 1) 2 6 (* 3 2) 3 24 (* 4 6) 4 120 (* 5 24) 5 値 (fact 5) n 再 帰 (zero? n) 赤字が見えると理解できる
  8. 8. おまけ 白金比, 青銅比 xyzzy で <ul><li>;; 白金比 </li></ul><ul><li>(defun pt (n) </li></ul><ul><li>(cond </li></ul><ul><li>((zerop n) 1.0) </li></ul><ul><li>(t (+ 2 (/ (pt (1- n))))))) </li></ul><ul><li>(pt 100) </li></ul><ul><li>2.414214 ;; (1- (pt 100)) √2 </li></ul><ul><li>;; 青銅比 </li></ul><ul><li>(defun bronze (n) </li></ul><ul><li>(cond </li></ul><ul><li>((zerop n) 1.0) </li></ul><ul><li>(t (+ 3 (/ (bronze (1- n))))))) </li></ul><ul><li>(bronze 100) </li></ul><ul><li>3.302776 </li></ul>
  9. 9.  3.14159 26535 89793 23846... <ul><li>(defun pi (n) </li></ul><ul><li>(pi1 (remove-if 'evenp (iota n)))) </li></ul><ul><li>(defun pi1 (l) </li></ul><ul><li>(cond </li></ul><ul><li>((null l) 1 ) </li></ul><ul><li>(t (cond </li></ul><ul><li>((= (car l) 1) </li></ul><ul><li>(+ 3.0 (/ (* (car l) (car l)) </li></ul><ul><li>(pi1 (cdr l))))) </li></ul><ul><li>(t (+ 6.0 (/ (* (car l) (car l)) </li></ul><ul><li>(pi1 (cdr l))))))))) </li></ul><ul><li>(pi 1000) </li></ul><ul><li>3.14159 3 </li></ul>
  10. 10.  gauche 3.14159 26535 89793 23846... <ul><li>(define pi </li></ul><ul><li>(lambda (n) </li></ul><ul><li>(pi1 (remove even? (iota n 1))))) </li></ul><ul><li>(define pi1 </li></ul><ul><li>(lambda (l) </li></ul><ul><li>(cond </li></ul><ul><li>((null? l) 1 ) </li></ul><ul><li>(else </li></ul><ul><li>(cond </li></ul><ul><li>((= (car l) 1) </li></ul><ul><li>(+ 3 (/. (* (car l) (car l)) </li></ul><ul><li>(pi1 (cdr l))))) </li></ul><ul><li>(else (+ 6 (/. (* (car l) (car l)) </li></ul><ul><li>(pi1 (cdr l))))) ))))) </li></ul><ul><li>(pi 1000000) ;; こんなんでもメチャメチャ早い! </li></ul><ul><li>gosh> 3.141592653589793 </li></ul>;;(iota n 1) (use srfi-1 ) gosh> ;( time (pi 180000)) ; real 0.344 ; user 0.297 ; sys 0.000 3.141592653589793
  11. 11.  gauche 2 改造 3.14159 26535 89793 23846... <ul><li>(define pi1 </li></ul><ul><li>(lambda (l) ; l:(1 3 5 7 9...) 奇数のリスト </li></ul><ul><li>(cond </li></ul><ul><li>((null? l) 1 ) </li></ul><ul><li>(else </li></ul><ul><li>(+ (if (= (car l) 1) 3 6) ;; 3 or 6 </li></ul><ul><li>(/. (* (car l) (car l)) </li></ul><ul><li>(pi1 (cdr l)))))))) </li></ul>割り算っぽく if も式なので値を返す 3項演算子風
  12. 12. これから 再帰 を考えた 連分数はまさに再帰? <ul><li>(+ 3 (/ (* 1 1) </li></ul><ul><li>(+ 6 (/ (* 3 3) </li></ul><ul><li>(+ 6 (/ (* 5 5) </li></ul><ul><li>(+ 6 (/ (* 7 7) </li></ul><ul><li>(+ 6 (/ (* 9 9) ;; 再帰 </li></ul><ul><li>1.0 ;; 締め </li></ul><ul><li>)))))))))) </li></ul><ul><li>gosh> 3.145 238095238095 </li></ul>
  13. 13. まとめ <ul><li>連分数は再帰的? </li></ul><ul><li>再帰はワンライナー生成器? </li></ul><ul><ul><li>つまり出口は一つ </li></ul></ul>
  14. 14. 参 考 <ul><li>xyzzy(win)でscheme-mode(gauche)使用 </li></ul><ul><li>連分数 wiki </li></ul><ul><li>http://ja.wikipedia.org/wiki/%E9%80%A3%E5%88%86%E6%95%B0 </li></ul><ul><li>黄金比 wiki </li></ul><ul><li>http://ja.wikipedia.org/wiki/%E9%BB%84%E9%87%91%E6%AF%94 </li></ul>

×