27
6.001 SICP 1 6.001 SICP – September ? 6001-Introduction Trevor Darrell [email protected] 32-D512 6.001 web page: http://sicp.csail.mit.edu/ section web page: http://www.csail.mit.edu/~trevor/6001/ • Abstractions Pairs and lists Common list operations

6.001 SICP – September ?

  • Upload
    paniz

  • View
    66

  • Download
    1

Embed Size (px)

DESCRIPTION

6.001 SICP – September ?. 6001-Introduction Trevor Darrell [email protected] 32-D512 6.001 web page: http://sicp.csail.mit.edu/ section web page: http://www.csail.mit.edu/~trevor/6001/ Abstractions Pairs and lists Common list operations. Procedural abstraction example: sqrt. - PowerPoint PPT Presentation

Citation preview

Page 1: 6.001 SICP – September ?

6.001 SICP 1

6.001 SICP – September ?6001-Introduction

Trevor Darrell [email protected] 32-D512

6.001 web page: http://sicp.csail.mit.edu/section web page: http://www.csail.mit.edu/~trevor/6001/

• Abstractions• Pairs and lists• Common list operations

Page 2: 6.001 SICP – September ?

6.001 SICP 2

Procedural abstraction example: sqrtTo find an approximation of square root of x:• Make a guess G• Improve the guess by averaging G and x/G• Keep improving the guess until it is good enough(define try (lambda (guess x) (if (good-enuf? guess x) guess (try (improve guess x) x))))(define improve (lambda (guess x) (average guess (/ x guess))))(define average (lambda (a b) (/ (+ a b) 2)))(define good-enuf? (lambda (guess x) (< (abs (- (square guess) x)) 0.001)))(define sqrt (lambda (x) (try 1 x)))

Page 3: 6.001 SICP – September ?

6.001 SICP 3

The universe of procedures for sqrt

try

improve

average

Good-enuf?

sqrt

Page 4: 6.001 SICP – September ?

6.001 SICP 4

sqrt - Block Structure(define sqrt (lambda (x) (define good-enuf? (lambda (guess) (< (abs (- (square guess) x)) 0.001))) (define improve (lambda (guess) (average guess (/ x guess)))) (define sqrt-iter (lambda (guess) (if (good-enuf? guess) guess (sqrt-iter (improve guess))))) (sqrt-iter 1.0)) )

good-enuf?improve

sqrt-iter

sqrtx: number : numberx

Page 5: 6.001 SICP – September ?

6.001 SICP 5

Pairs (cons cells)• (cons <x-exp> <y-exp>) ==> <P> ;type: x, x Pair

• Where <x-exp> evaluates to a value <x-val>, and <y-exp> evaluates to a value <y-val>

• Returns a pair <P> whose car-part is <x-val> and whose cdr-part is <y-val>

• (car <P>) ==> <x-val> ;type: Pairtype of car part

• Returns the car-part of the pair <P>

• (cdr <P>) ==> <y-val> ;type: Pairtype of cdr part

• Returns the cdr-part of the pair <P>

Page 6: 6.001 SICP – September ?

6.001 SICP 6

Pair - Box and pointer diagram

(define p (cons <el1> <el2>))

p

(car p)

(cdr p)

<el1>

<el2>

Page 7: 6.001 SICP – September ?

6.001 SICP 7

Lists - Box and pointer diagram•(cons <el1> (cons <el2> nil))

•(list <el1> <el2> ... <eln>)

<el1> <el2> <eln>

<el1> <el2>

Page 8: 6.001 SICP – September ?

6.001 SICP 8

Printed representation

(define x (list 1 2))(define y (list (list 1 2) (list 1 2))(define z (list x x))

X == (1 2)

Y == ((1 2)(1 2))

Z == ((1 2)(1 2))

Page 9: 6.001 SICP – September ?

6.001 SICP 9

Cons, car, cdr(define thing (cons (cons 1 nil) (cons 2 (cons 3 nil))))thing ==> ((1) 2 3)

(cons 1 nil) ==> (1)

(cons 1 (cons 2 nil)) ==> (1 2)

(car thing) ==> (1)

(cdr thing) ==> (2 3)

(car (car thing)) ==> 1

(car (cdr (cdr thing))) ==> 3

Page 10: 6.001 SICP – September ?

6.001 SICP 10

List drill(car (cons (+ 1 2) (- 3 4))) ==> 3(cdr 6) ==> error(cdr (car (cons (cons 1 2) (cons 3 4)))) 2(pair? #t) ==> #f(pair? (car (cons 1 2))) ==> #f(pair? (cons (+ 1 2) (car (cons (3 4))))) ==> #t

Page 11: 6.001 SICP – September ?

6.001 SICP 11

Length of a list

(define (length lst) (if (null? lst) 0 (+ 1 (length (cdr lst))))

Page 12: 6.001 SICP – September ?

6.001 SICP 12

cdr’ing down a list

(define (list-ref lst n) (if (= n 0) (car lst) (list-ref (cdr lst) (- n 1))))

Page 13: 6.001 SICP – September ?

6.001 SICP 13

More list drillx => (())y => (1 2 3)z => (1 (2 3) ((4)))w => (1 2 3 4 5)

(length x)

(length y)

(length z)

(list-ref z 2)

(append x y)

(cons x y)

Page 14: 6.001 SICP – September ?

6.001 SICP 14

More list drillx => (())y => (1 2 3)z => (1 (2 3) ((4)))w => (1 2 3 4 5)

(length x) 1

(length y) 3

(length z) 3

(list-ref z 2) ((4))

(append x y) (() 1 2 3)

(cons x y) ((()) 1 2 3)

Page 15: 6.001 SICP – September ?

6.001 SICP 15

Orders of Growth

What is the order of growth of last-k ?

(define (last-k k lst) (if (= (length lst) k) lst (last-k k (cdr lst))))

Page 16: 6.001 SICP – September ?

6.001 SICP 16

Orders of Growth

What is the order of growth of last-k ?

(define (last-k k lst) (if (= (length lst) k) lst (last-k k (cdr lst))))

( n2 )

Page 17: 6.001 SICP – September ?

6.001 SICP 17

Writing some procedures

The procedure copy-some that copies the first n elements of a list

(copy-some 3 (list 1 2 3 4 5)) ==> (1 2 3)

(define (copy-some n list)

)

Page 18: 6.001 SICP – September ?

6.001 SICP 18

Writing some procedures

The procedure copy-some that copies the first n elements of a list

(copy-some 3 (list 1 2 3 4 5)) ==> (1 2 3)

(define (copy-some n list) (if (= n 0) nil

(cons (car lst) (copy-some (- n 1) (cdr

lst)))))

Page 19: 6.001 SICP – September ?

6.001 SICP 19

Writing some procedures

(repeat x m) returns a list containing the value x repeated m times.  For example:

(repeat 5 3) => (5 5 5)     

(repeat (list 1 2) 2) => ((1 2) (1 2))

Page 20: 6.001 SICP – September ?

6.001 SICP 20

Writing some procedures

Recursive solution: (define (repeat x m)(if (= m 0)

nil(cons x (repeat x (- m 1)))))

time Θ(m)space Θ(m)

Iterative solution: (define (repeat x m) (define (helper i answer)

(if (> i m)answer (helper (+ 1 i) (cons x answer))))

(helper 0 nil))time Θ(m)space Θ(1)

Page 21: 6.001 SICP – September ?

6.001 SICP 21

Writing some procedures

(append lst1 lst2) appends lst2 to the end of lst1.  E.g.:            

(append (list 0 1 2) (list 3 4)) => (0 1 2 3 4)       

(append nil (list 5 6)) => (5 6)

Page 22: 6.001 SICP – September ?

6.001 SICP 22

Writing some proceduresRecursive solution:(define (append lst1 lst2) (if (null? lst) lst2 (cons (car lst1) (append (cdr lst1) lst2))))

time Θ(n), space Θ(n) where n=(length lst1)

Notice that only lst1 affects the time and space growth.  Why doesn't lst2 matter?

Page 23: 6.001 SICP – September ?

6.001 SICP 23

Writing some procedures

(reverse lst) reverses lst.  E.g.:            

(reverse (list 0 1 2)) => (2 1 0)     

(reverse (list (list 3 5) (list 2 4))) => ((2 4) (3 5))

Page 24: 6.001 SICP – September ?

6.001 SICP 24

Writing some procedures

Recursive solution:(define (reverse lst) (if (null? lst) nil (append (reverse (cdr lst)) (list (car l)))))time Θ(n^2), since append runs in linear time (Θ(m) where m=(length answer)), each successive call to append takes more and more time: 1 + 2 + 3 + ... + n = Θ(n^2). space Θ(n), where n=(length lst)

Iterative solution:(define (reverse lst) (define (helper rest answer) (if (null? rest) answer (helper (cdr rest) (cons (car rest) answer))))) (helper lst nil))time Θ(n^2), space Θ(1), where n=(length lst)

Page 25: 6.001 SICP – September ?

6.001 SICP 25

Writing some procedures

(num-leaves tree) returns the number of leaves in a tree, where a leaf is anything that isn't a list (number, string, boolean, procedure). E.g.:       

(num-leaves (list 0 1 (list 3 5) (list 2 (list 4)))) => 6   

(num-leaves (list (list (list (list nil))))) => 0

Page 26: 6.001 SICP – September ?

6.001 SICP 26

Writing some procedures

(define (num-leaves tree) (cond ((null? tree) 0) ((pair? tree) (+ (num-leaves (car tree)) (num-leaves (cdr tree))) (else 1)))

time Θ(n), space Θ(d), where n is the number of pairs in the tree, and d is the depth of the tree.

Page 27: 6.001 SICP – September ?

6.001 SICP 27

Remember…• calendar…