流(3.5.1~3.5.2)
2016-06-05 11:25
363 查看
;流实现的行为方式 ;delay和force的实现 (define (memo-proc proc) (let ((already-run? false) (result false)) (lambda () (if already-run? result (begin (set! already-run? true) (set! result (proc)) result))))) ;(delay exp)应该等价于下面这个式子,但不能用define,目前不知道该如何绑定 (memo-proc (lambda () exp)) (define (test-func) (define (fib n) (if (< n 2) n (+ (fib (- n 1)) (fib (- n 2))))) (fib 30)) (define promise (memo-proc (lambda () (test-func)))) (define (my-force delayed-project) (delayed-project)) ;分别求值下面两个表达式,比较速度 (my-force promise) (my-force promise) ;3.50 (define (my-stream-map proc . argstreams) (if (empty-stream? (car argstreams)) the-empty-stream (cons-stream (apply proc (map stream-car argstreams)) (apply my-stream-map (cons proc (map stream-cdr argstreams)))))) (define a (cons-stream 1 (cons-stream 2 (cons-stream 3 the-empty-stream)))) (define b (cons-stream 1 (cons-stream 2 (cons-stream 3 the-empty-stream)))) (define c (cons-stream 1 (cons-stream 2 (cons-stream 3 the-empty-stream)))) (define (display-stream stream) (if (empty-stream? stream) the-empty-stream (cons (stream-car stream) (display-stream (stream-cdr stream))))) (display-stream (my-stream-map + a b c)) ;3.51 (define (stream-enumerate-interval low high) (if (> low high) the-empty-stream (cons-stream low (stream-enumerate-interval (+ 1 low) high)))) (define (display-line x) (newline) (display x)) (define (show x) (display-line x) x) (define x (stream-map show (stream-enumerate-interval 0 10))) (stream-ref x 5) (stream-ref x 7) ;3.52 (define (stream-filter pred? stream) (cond ((empty-stream? stream) the-empty-stream) ((pred? (stream-car stream)) (cons-stream (stream-car stream) (stream-filter pred? (stream-cdr stream)))) (else (stream-filter pred? (stream-cdr stream))))) (define sum 0) (define (accum x) (set! sum (+ x sum)) sum) (define seq (stream-map accum (stream-enumerate-interval 1 20))) (define y (stream-filter even? seq)) (define z (stream-filter (lambda (x) (= (remainder x 5) 0)) seq)) (stream-ref y 7) (display-stream z) ;无穷流 (define (integers-starting-from n) (cons-stream n (integers-starting-from (+ n 1)))) (define integers (integers-starting-from 1)) (define no-sevens (stream-filter (lambda (x) (not (= (remainder x 7) 0))) integers)) (define (fibgen a b) (cons-stream a (fibgen b (+ a b)))) (define (divsible? x y) (= (remainder x y) 0)) (define (sieve stream) (cons-stream (stream-car stream) (sieve (stream-filter (lambda (x) (not (divsible? x (stream-car stream)))) (stream-cdr stream))))) (define primes (sieve (integers-starting-from 2))) ;隐式地定义流 (define ones (cons-stream 1 ones)) (define (add-streams s1 s2) (stream-map + s1 s2)) (define (scale-stream stream factor) (stream-map (lambda (x) (* x factor)) stream)) (define double (cons-stream 1 (scale-stream double 2))) (define primes (cons-stream 2 (stream-filter prime? (integers-starting-from 3)))) (define (prime? x) (define (iter ps) (let ((p (stream-car ps))) (cond ((> (square p) x) true) ((= (remainder x p) 0) false) (else (iter (stream-cdr ps)))))) (iter primes)) ;3.53 (define s (cons-stream 1 (add-streams s s))) (stream-ref s 8) ;3.54 (define (mul-streams s1 s2) (cons-stream (* (stream-car s1) (stream-car s2)) (mul-streams (stream-cdr s1) (stream-cdr s2)))) (define factorials (cons-stream 1 (mul-streams factorials (integers-starting-from 2)))) ;3.55 (define (partial-sums s) (define the-partial-sums (cons-stream (stream-car s) (add-streams (stream-cdr s) the-partial-sums))) the-partial-sums) ;nice and elegant,相当于从相反的方向构建 (define (partial-sums-2 s) (define the-partial-sums (add-streams s (cons-stream 0 the-partial-sums))) the-partial-sums) (define z (partial-sums-2 integers)) ;3.56 (define (merge s1 s2) (cond ((empty-stream? s1) s2) ((empty-stream? s2) s1) (else (let ((s1car (stream-car s1)) (s2car (stream-car s2))) (cond ((< s1car s2car) (cons-stream s1car (merge (stream-cdr s1) s2))) ((= s1car s2car) (cons-stream s1car (merge (stream-cdr s1) (stream-cdr s2)))) (else (cons-stream s2car (merge s1 (stream-cdr s2))))))))) (define s (cons-stream 1 (merge (scale-stream s 2) (merge (scale-stream s 3) (scale-stream s 5))))) ;3.58这个过程求的是radix进制下(num/den)的小数部分,需假设num<den (define (expand num den radix) (cons-stream (quotient (* num radix) den) (expand (remainder (* num radix) den) den radix))) (define z (expand 1 7 10)) (define (show-n s n) (if (= n 0) '() (cons (stream-car s) (show-n (stream-cdr s) (- n 1))))) (show-n z 6) (show-n z 12) ;3.59 ;;a (define (integrate-series s) (stream-map / s integers)) (define exp-series (cons-stream 1 (integrate-series exp-series))) (show-n exp-series 8) ;;b (define cosine-series (cons-stream 1 (scale-stream (integrate-series sine-series) -1))) (define sine-series (cons-stream 0 (integrate-series cosine-series))) (show-n cosine-series 9) (show-n sine-series 9) ;3.60 (define (mul-series s1 s2); (cons-stream (* (stream-car s1) (stream-car s2)) (add-streams (scale-stream (stream-cdr s2) (stream-car s1)) (mul-series (stream-cdr s1) s2)))) (define (mul-series-2 s1 s2);o(n^2) (add-streams (scale-stream s2 (stream-car s1)) (cons-stream 0 (mul-series-2 (stream-cdr s1) s2)))) (define sine*cosine (mul-series sine-series cosine-series)) (show-n sine*cosine 10) ;3.61 (define (1/S s) (define the-1/S (cons-stream 1 (mul-series (scale-stream (stream-cdr s) -1) the-1/S))) the-1/S) ;warning:下面这个版本直接用递归,由于每次调用1/S时都会产生一个新的流,所以在计算过程中,记忆功能实际上并没有用到,但是算过一次后,两者的表现是一样的,读者可以分别运行两个版本多次比较差别 (define (1/S s) (cons-stream 1 (mul-series (scale-stream (stream-cdr s) -1) (1/S s)))) ;3.62 (define (div-series s1 s2) (if (= (stream-car s2) 0) (error "div-series: divided by zero!") (mul-series s1 (1/S s2)))) (define tan-series (div-series sine-series cosine-series)) (show-n tan-series 9)
相关文章推荐
- Node.js中的流(Stream)介绍
- 用NODE.JS中的流编写工具是要注意的事项
- PHP Streams(流)详细介绍及使用
- 简单总结Java IO中stream流的使用方法
- 用Python编写一个简单的Lisp解释器的教程
- 举例讲解Java中的Stream流概念
- Windows下Lisp环境配置
- 生活在REPL中,工具与程序一体
- 我以为的函数式编程
- authentication password与scheme区别
- 在Ubuntu12.04上的Common Lisp开发环境配置
- OSX 10.09上的common lisp环境搭建
- emacs学习
- MIT-scheme写的一个数据处理程序
- authentic Arizona Cardinals jerseys b2bjersey.com 8n
- 创造者的鉴赏力[转]
- 你需要掌握的三种编程语言
- Common Lisp 学习书目
- Beginning of Learning LISP.
- Begining Of Learning LISP (2)