Loading...

PPT – Recursion PowerPoint presentation | free to download - id: 4b3526-MzdhM

The Adobe Flash plugin is needed to view this content

Recursion

- To understand recursion,
- one must first understand recursion.

Specifying Incremental Work

0 -gt f(0)

D1

1 -gt f(1)

...

n -gt f(n)

Dn

n1 -gt f(n1)

Divide and Conquer

Problem

decomposition

Subproblem1

Subproblem2

recursion

primitive

Subsolution1

Subsolution2

composition

Solution

Cartesian Product

- gt (cart2 '(1 2) '(a b))
- ( (1 a) (1 b) (2 a) (2 b) )
- gt (cart2 '(0 1 2) '(a b))
- ( (0 a) (0 b) (1 a) (1 b) (2 a) (2 b)

) - gt (couple ' 1 '(b c))
- ( (1 b) (1 c) )
- gt (couple ' 1 '(a b c))
- ( (1 a) (1 b) (1 c) )

Divide and Conquer

(cart2 '(a b) '(1))

car/cdr

(couple ' a '(1))

(cart2 '(b) '(1))

recursion

primitive

((a 1))

((b 1))

append

((a 1) (b 1))

Different Problems Same pattern

Scheme Definition

- (define (cart2 x y)
- (if (null? x) '()
- (append (couple (car x) y)
- (cart2 (cdr x) y)
- )
- )
- )
- (define (couple a y)
- (if (null? y) '()
- (cons (list a (car y))
- (couple a (cdr y))
- )
- )
- )

Alternate Syntax lambda

- (define cart2
- (lambda (x y)
- (if (null? x) '()
- (append (couple (car x) y)
- (cart2 (cdr x) y)
- )
- )
- )
- )
- (define couple
- (lambda (a y)
- (if (null? y) '()
- (cons (list a (car y))
- (couple a (cdr y))
- )
- )
- )
- )

Clojure Syntax

- (defn couple a y
- (if (empty? y) '()
- (cons (list a (first y))
- (couple a (rest y))
- ) ) )
- (defn cart2 x y
- (if (empty? x) '()
- (concat (couple (first x) y)
- (cart2 (rest x) y)
- ) ) )

Powerset

- gt (powerset '(2))
- ( ( ) (2) )
- gt (powerset '(1 2) )
- ( (1) (1 2) () (2) )
- gt (powerset '(0 1 2))
- ( (0 1) (0 1 2) (0) (0 2)
- (1) (1 2) () (2) )
- Subsets of 0,1,2 with 0 are equinumerous

with subsets of 0,1,2 without 0.

- (define (powerset s)
- (if (null? s) '(())
- (append (ins (car s)
- (powerset (cdr s))
- )
- (powerset (cdr s))
- )
- ))
- (define (ins a ss)
- (if (null? ss) '()
- (cons (cons a (car ss))
- (ins a (cdr ss))
- )
- ))

Alternate Syntax let

- (define (powerset s)
- (if (null? s) '(())
- (let ( (aux (powerset (cdr s))) )
- (append (ins (car s) aux)
- aux
- )
- )
- ))
- (define (ins a ss)
- (if (null? ss) '()
- (cons (cons a (car ss))
- (ins a (cdr ss))
- )
- ))

Clojure Syntax

- (defn ins a ss
- (if (empty? ss) '()
- (cons (cons a (first ss))
- (ins a (rest ss))
- )
- ))
- (defn powerset s
- (if (empty? s) '(())
- (let aux (powerset (rest s))
- (concat (ins (first s) aux)
- aux
- )
- )
- ))

Related problems Different Patterns

Remove-First-TopLevel

- (define (rm-fst-top sym lis)
- (if (null? lis) '()
- (if (eq? sym (car lis)) (cdr lis)
- (cons (car lis)
- (rm-fst-top sym (cdr lis))
- )
- )
- )
- )
- gt (rm-fst-top 'a '(b (b a) a b a))

(b (b a) b a) - Linear recursion

Alternate Syntax if gt cond

- (define (rm-fst-top sym lis)
- (cond ( (null? lis) '())
- ( (eq? sym (car lis)) (cdr lis) )
- ( else
- (cons (car lis)
- (rm-fst-top sym (cdr lis))
- )
- )
- )
- )
- gt (rm-fst-top 'a '(b (b a) a b a))

(b (b a) b a) - Linear recursion

Remove-All-TopLevel

- (define (rm-all-top sym lis)
- (cond ( (null? lis) '())
- ( (eq? sym (car lis))
- (rm-all-top sym (cdr lis) ) )

- ( else (cons (car lis)
- (rm-all-top sym (cdr lis)))
- )
- )
- )
- gt (rm-all-top 'a '(b (b a) a b a))

(b (b a) b) - gt (rm-all-top ' (b a) '(b (b a) a b a))

(b (b a) a b a) - Linear recursion

Remove-All-Expression-TopLevel

- (define (rm-all-top exp lis)
- (cond ( (null? lis) '())
- ( (equal? exp (car lis))
- (rm-all-top exp (cdr lis) ) )

- ( else (cons (car lis)
- (rm-all-top exp (cdr lis))))
- )
- )
- gt (rm-all-top ' (b a) '(b (b a) a b a))

(b a b a) - Linear recursion

Remove-All

- (define (rm-all sym ll)
- (cond ( (null? ll) '())
- ( (symbol? (car ll))
- (if (eq? sym (car ll))
- ( rm-all sym (cdr ll) )
- ( cons (car ll)
- (rm-all sym (cdr ll)) ) )
- )
- (else (cons (rm-all sym (car ll))
- (rm-all sym (cdr ll))
- )
- )
- )
- )
- gt (rm-all ' a '(b (b a) a b a)) (b

(b) b) - Double recursion

rm-all Structural recursion

- Empty list (Basis case)
- (rm-all 'a '())
- First Atom (Recursive case)
- (rm-all 'a '(a b c a))
- (rm-all 'a '(b b c a))
- First - Nested list (Recursive case)
- (rm-all 'a '((a b c) d (a)))
- (rm-all 'a '(b (a b c) d (a)))

Insertion sort (Note creates a sorted copy)

- (define (insert n lon)
- (cond ((null? lon) (list n))
- ((gt n (car lon))
- (cons (car lon) (insert n (cdr lon))))

- (else (cons n lon))
- )
- )
- (define (ins-sort lon)
- (if (null? lon) '()
- (insert (car lon) (ins-sort (cdr lon)))
- )
- )
- Precondition second arg to insert ordered.
- Postcondition insert returns an ordered list.

Clojure Syntax

- (defn insert n lon
- (cond (empty? lon) (list n)
- (gt n (first lon))
- (cons (first lon) (insert n (rest

lon))) - true (cons n lon))
- )
- )
- (defn ins-sort lon
- (if (empty? lon) '()
- (insert (first lon) (ins-sort (rest lon)))
- )
- )
- Precondition second arg to insert ordered.
- Postcondition insert returns an ordered list.

Subset (uses OR and AND instead of IF)

- (define (subset? ss s)
- (or (null? ss)
- (and (member (car ss) s)
- (subset? (cdr ss) s) ) )
- )
- 1gt (subset? '(a b c) '(A p 1 C 2 B q r))
- t
- 2gt (subset? '(a b c) '(p))
- f

Anonymous functions and list membership test in

Clojure

- gt ( (fn x y ( x y)) 25 30)
- 55
- gt ( ( 1 2) 25 30)
- 55
- gt (some ( 5 ) '(5 30))
- true
- gt (some ( 5 ) '(15 30))
- nil

Subset in Clojure (cf. case sensitive Scheme)

- (defn subset? ss s
- (or (empty? ss)
- (and (some ( (first ss) ) s)
- (subset? (rest ss) s) ) )
- )
- gt (subset? '() '(A p 1 C 2 B q r))
- true
- gt (subset? '(a b c) '(A p 1 C 2 B q r))
- nil
- gt (subset? '(a b c) '(p a c b))
- true

Expression evaluation A simple syntax directed

translation

- expr -gt x y z
- expr -gt ( expr expr)
- expr -gt (if expr expr expr)
- Write a recursive definition for a function ops

that counts the number of s.

- (define (ops e)
- e is assumed to be a symbol or a list
- (cond
- ((symbol? e) 0)
- ((eq? (car e) ')
- ( 1 (ops (cadr e))
- (ops (caddr e))) )
- ((eq? (car e) 'if)
- ( (ops (cadr e))
- (ops (caddr e))
- (ops (cadddr e))))
- (else (display 'ILLEGAL))
- )
- )

- (defn third x (second (rest x)))
- (defn ops e Clojure code
- "e is assumed to be a symbol or a list"
- (cond
- (symbol? e) 0
- ( (first e) ')
- ( 1 (ops (second e))
- (ops (third e)) )
- ( (first e) 'if)
- ( (ops (second e))
- (ops (third e))
- (ops (last e)))
- true 'ILLEGAL
- ))

- (Alternative Scheme syntax with member and

case-construct (not equivalent)) - (define (ops e)
- e is assumed to be a symbol or a list
- (if (member e '(x y z)) 0
- (if (symbol? e) (display 'ILLEGAL)
- (case (car e)
- (() ( 1 (ops (cadr e))
- (ops (caddr e))) )
- ((if) ( (ops (cadr e))
- (ops (caddr e))
- (ops (cadddr e))) )
- (else (display 'ILLEGAL))) )
- ))

Examples

- (ops 'x)
- 0
- (ops '( y z))
- 1
- (ops '(if x ( y z) ( x z)))
- 2

- (Alternative syntax in Clojure (not equivalent or

robust)) - (defn ops e
- e is assumed to legal
- (if (some ( e ) '(x y z)) 0
- (if (symbol? e) (println 'ILLEGAL)
- (case (first e)
- () ( 1 (ops (second e))
- (ops (last e)))
- (if) ( (ops (second e))
- (ops (third e))
- (ops (last e)))
- (println 'ILLEGAL))) ) )