1. 程式人生 > 其它 >[2021 Spring] CS61A 學習筆記 Homework 8: More Scheme

[2021 Spring] CS61A 學習筆記 Homework 8: More Scheme

[2021 Spring] CS61A 學習筆記 Homework 8: More Scheme

作業說明:https://inst.eecs.berkeley.edu/~cs61a/sp21/hw/hw08/

目錄

Q1: WWSD: Quasiquote

注意點: ','後的expr會被eval。

Q2: Tail Recursive Accumulate

將hw07中的accumulate修改為tail-recursive。其實寫hw07的時候已經是tail-recursive了,直接用就行。

(define (accumulate-tail combiner start n term)
    (if (< n 1) start
        (accumulate-tail combiner (combiner start (term n)) (- n 1) term)))

Q3: Derive Sum

derive返回EXPR對VAR的導數,按照求導法則寫出程式碼。
\((f(x) + g(x))' = f'(x) + g'(x)\)

(define (derive-sum expr var) 
    (make-sum (derive (first-operand expr) var) 
              (derive (second-operand expr) var)))

Q4: Derive Product

\((f(x) g(x))' = f'(x) g(x) + f(x) g'(x)\)

(define (derive-product expr var) 
    (make-sum (make-product (derive (first-operand expr) var)
                            (second-operand expr))
              (make-product (first-operand expr)
                            (derive (second-operand expr) var))))

Q5: Make Exp

reformat優化格式

; Exponentiations are represented as lists that start with ^.
(define (make-exp base exponent)
  (cond 
    ((=number? exponent 0)
     1)
    ((=number? exponent 1)
     base)
    ((and (number? base) (number? exponent))
     (expt base exponent))
    (else
     (list '^ base exponent))))

(define (exp? exp)
  (and (list? exp) (eqv? (car exp) '^)))

Q6: Derive Exp

\([f(x)^{g(x)}]' = f(x)^{g(x) - 1} * g(x)\)
注意點:make-product的順序

(define (derive-exp exp var)
  (make-product (second-operand exp)
                (make-exp (first-operand exp)
                          (- (second-operand exp) 1))))