zoukankan      html  css  js  c++  java
  • SICP_2.56-2.57

    #lang racket
    
    ;;;;;;;;;;;;;;;只需先写出按愿望和公式而构造的函数
    ;;;;;;;;;;;;;;;再加上一些特定的选择函数和构造函数就可以实现这么强大的功能
    
    ;;;;;;;;;;;;;;;quote 和 list 的区别
    (define (deriv exp var)
      (cond ((number? exp) 0)
            ((variable? exp)
             (if (same-variable? exp var) 1 0))
            ((sum? exp)
             (make-sum (deriv (addend exp) var)
                       (deriv (augend exp) var)))
            ((product? exp)
             (make-sum
              (make-product (multiplier exp)
                            (deriv (multiplicand exp) var))
              (make-product (deriv (multiplier exp) var)
                            (multiplicand exp))))
            ((exponentiation? exp)
             (make-product (make-product (exponent exp)
                              (make-exponentiation (base exp) (- (exponent exp) 1)))
                           (deriv (base exp) var)))
            (else
             (error "unknow expression type --DERIV" exp))))
    
    (define (variable? x)
      (symbol? x))
    
    (define (same-variable? v1 v2)
      (and (variable? v1) (variable? v2) (eq? v1 v2)))
    
    (define (=number? exp num)
      (and (number? exp) (= exp num)))
    
    (define (** a b)
      (define (iter n result)
          (cond ((= 0 b) 1)
              ((or (< n b) (= n b)) (iter (+ n 1) (* a result)))
              ((> n b) result)))
      (iter 1 1))
    
    (define (sum? x)
      (and (pair? x) (eq? (car x) '+)))
    
    ;(define (addend s) (cadr s))
    
    ;(define (augend s) (caddr s))
    
    (define (product? x)
      (and (pair? x) (eq? (car x) '*)))
    
    ;(define (multiplier p) (cadr p))
    
    ;(define (multiplicand p) (caddr p))
    
    (define (exponentiation? x)
      (and (pair? x) (eq? (car x) '**)))
    
    (define (base e) (cadr e))
    
    (define (exponent e) (caddr e))
    
    (define (make-exponentiation b1 b2)
      (cond ((=number? b2 0) 1)
            ((=number? b2 1) b1)
            ((and (number? b1) (number? b2)) (** b1 b2))
            (else (list '** b1 b2))))
    
    (define (make-sum a1 a2)
      (cond ((=number? a1 0) a2)
            ((=number? a2 0) a1)
            ((and (number? a1) (number? a2)) (+ a1 a2))
            (else (list '+ a1 a2))))
    
    (define (make-product m1 m2)
      (cond ((or (=number? m1 0) (=number? m2 0)) 0)
            ((=number? m1 1) m2)
            ((=number? m2 1) m1)
            ((and (number? m1) (number? m2)) (* m1 m2))
            (else (list '* m1 m2))))
    
    ;;;;;;;;;;;;test
    ;(deriv '(* (* x y) (+ x 3)) 'x)
    ;(deriv '(** (+ x y) 4) 'x)
    ;(deriv '(+ (* x y) x) 'x)
    
    ;;;;;;;;;;;;;2.58
    (define (addend s)
      (cadr s))
    
    (define (augend s)
      (if (null? (cdddr s))
          (caddr s)
          (cons '+ (cddr s))))
    
    (define (multiplier p)
      (cadr p))
    
    (define (multiplicand p)
      (if (null? (cdddr p))
          (caddr p)
          (cons '* (cddr p))))
    
    ;;;;;;;;;;;;test
    (deriv '(+ (* x 4) (+ x x) (* x x)) 'x)
    (deriv '(* (+ x 4) (* x 4) y (** x 3)) 'y)

    1.这几题进一步强化了按愿望实现函数的方法

    2.quoto 和 list 的区别  参考

    (1)' 是quoto 的缩写

    (2)' 后的内容会原样返回,因为 ' 就是个省略了的单引号 

    (= '3 3)    ->#t

    (car  '(list a b))   ->list    (和sicp_2.55同理)

    (3)list 是个函数

    (list (+ 1 3) (+ 2 5)) -> (4 7)

    Yosoro
  • 相关阅读:
    自动补全的java封装
    angular创建服务
    forEach和for包含异步调用的区别
    angular获取dom节点
    angular父组件给子组件传值
    angular环境
    SQL Server DBA 30问 【itpub】 天高地厚
    【转】任务管理器各参数说明 天高地厚
    开机引导 天高地厚
    测试发现数据库性能问题后的SQL调优 天高地厚
  • 原文地址:https://www.cnblogs.com/tclan126/p/6443803.html
Copyright © 2011-2022 走看看