Ghost_Lee

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

SCIP | SCIP程序解释 - 博客园

Part1 Bulding Abstraction with Procedure

本类blog主要对SICP书中的程序进行说明。

#+STARTUP:

** Example:Square Roots by Newton's Method
#+BEGIN_SRC scheme
#lang racket
(define (sqrt-iter guess x)
  (if (good-enough? guess x)
      guess
      (sqrt-iter (improve guess x)
                 x)))

(define (improve guess x)
  (average guess (/ x guess)))

(define (average x y)
  (/ (+ x y) 2))

(define (good-enough? guess x)
  (< (abs (- (square guess) x)) 0.000001))

(define (abs x)
  (cond ((> x 0) x)
        ((= x 0) 0)
        ((< x 0) (- x))))

(define (square x)
  (* x x))

(define (sqrt x)
  (sqrt-iter 1 x))
#+END_SRC

** Procedures as Arguments
#+BEGIN_SRC scheme
#lang racket
;;Page 60
(define (sum term a next b)
  (if (> a b)
      0
      (+ (term a)
         (sum term (next a) next b))))

(define (inc n) (+ n 1))
(define (cube x) (* x x x))

(define (sum-cubes a b)
  (sum cube a inc b))

(define (identity x) x)
(define (sum-integers a b)
  (sum identity a inc b))

(define (integral f a b dx)
  (define (add-dx x) (+ x dx))
  (* (sum f (+ a (/ dx 2.0)) add-dx b)
     dx))

#+END_SRC



** Finding roots of equations by the half-interval method
#+BEGIN_SRC scheme
#lang racket

;;neg-point pos-point是指这个函数运行后的值是正还是负所对应的点
(define (search f neg-point pos-point)
  (let ((midpoint (average neg-point pos-point)))
    (if (close-enough? neg-point pos-point)
        midpoint
        (let ((test-value (f midpoint)))
          (cond ((> test-value 0)
                 (search f neg-point midpoint))
                ((< test-value 0)
                 (search f midpoint pos-point))
                (else midpoint))))))

(define (average x y) (/ (+ x y) 2))

(define (close-enough? x y)
  (< (abs (- x y)) 0.001))

;;这里针对不同点位的情况进行了分类
(define (half-interval-method f a b)
  (let ((a-value (f a))
        (b-value (f b)))
    (cond ((and (< a-value 0) (> b-value 0))
          (search f a b))
          ((and (> a-value 0) (< b-value 0))
           (search f b a))
          (else
           (error "Values are not of opposite sign" a b)))))

;;使用lambda表达式的好处就是用一个通用的表达式即可,而不需要反复不断的定义新的变量名字
;;如果要使用新的(half-interval-method)过程,可以做如下的定义
(half-interval-method (lambda (x) (- (* x x x) (* 2 x) 3)) 1.0 2.0)
#+END_SRC
View Code

 

posted on 2019-03-02 00:38  Ghost_Lee  阅读(543)  评论(0编辑  收藏  举报