scheme 符号求导程序

SICP 习题:


#lang scheme

( define ( variable? x )
   ( symbol? x ) )

( define ( same-variable? x y )
   ( and ( variable? x )
         ( variable? y )
         ( eq? x y ) ) )

( define ( =number? exp num )
   ( and ( number? exp )
         ( = exp num ) ) )

( define ( addend x )
   ( cadr x ) )

( define ( augend x )
   ( if ( null? ( cdddr x ) )
        ( caddr x )
        ( cons '+ ( cddr x ) ) ) )

( define ( sum? x )
   ( and ( pair? x )
         ( eq? ( car x ) '+ ) ) )

( define ( make-sum x y )
   ( cond
      [ ( =number? x 0 ) y ]
      [ ( =number? y 0 ) x ]
      [ ( and ( number? x )
              ( number? y ) )
        ( + x y ) ]
      [ else
        ( list '+ x y ) ] ) )

( define ( multiplier x )
   ( cadr x ) )

( define ( multiplicand x )
   ( if ( null? ( cdddr x ) )
        ( caddr x )
        ( cons '* ( cddr x ) ) ) )

( define ( product? x )
   ( and ( pair? x )
         ( eq? ( car x ) '* ) ) )

( define ( make-product x y )
   ( cond
      [ ( or ( =number? x 0 )
             ( =number? y 0 ) ) 0 ]
      [ ( =number? x 1 ) y ]
      [ ( =number? y 1 ) x ]
      [ ( and ( number? x )
              ( number? y ) )
        ( * x y ) ]
      [ else
        ( list '* x y ) ] ) )

( define ( exponentiation? exp )
   ( and ( pair? exp )
         ( eq? ( car exp ) '** ) ) )  

( define ( base exp )
   ( cadr exp ) )

( define ( exponent exp )
   ( caddr exp ) )

( define ( make-exponentiation base exp )
   ( cond
      [ ( =number? base 1 ) 1 ]
      [ ( =number? exp 1 ) base ]
      [ ( =number? exp 0 ) 1 ]
      [ else
        ( list '** base exp ) ] ) )

( define ( deriv expr var )
   ( cond
      [ ( number? expr ) 0 ]
      [ ( variable? expr )
        ( if ( same-variable? expr var ) 1 0 ) ]
      [ ( sum? expr )
        ( make-sum ( deriv ( addend expr ) var )
                   ( deriv ( augend expr ) var ) ) ]
      [ ( product? expr )
        ( make-sum ( make-product ( multiplier expr )
                                  ( deriv ( multiplicand expr ) var ) )
                   ( make-product ( deriv ( multiplier expr ) var )
                                  ( multiplicand expr ) ) ) ]
      [ ( exponentiation? expr )
        ( make-product ( make-product ( exponent expr )
                                      ( make-exponentiation ( base expr )
                                                            ( make-sum ( exponent expr ) -1 ) ) )
                       ( deriv ( base expr ) var ) ) ]
      [ else
        ( error "unkown exp" expr ) ] ) )


( deriv '( + 1 x ) 'x )
( deriv '( * ( * x y )
             ( + x 3 ) ) 'x )
( deriv '( * x y ( + x 3 ) ) 'x )



  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值