Recursion - PowerPoint PPT Presentation

Loading...

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



Loading


The Adobe Flash plugin is needed to view this content

Get the plugin now

View by Category
About This Presentation
Title:

Recursion

Description:

Recursion To understand recursion, one must first understand recursion. cs3180(Prasad) L14Recur+Clojure * (couple ' (1) '(a ( – PowerPoint PPT presentation

Number of Views:62
Avg rating:3.0/5.0
Slides: 32
Provided by: cecsWrig9
Learn more at: http://cecs.wright.edu
Category:
Tags: recursion

less

Write a Comment
User Comments (0)
Transcript and Presenter's Notes

Title: Recursion


1
Recursion
  • To understand recursion,
  • one must first understand recursion.

2
Specifying Incremental Work
0 -gt f(0)
D1
1 -gt f(1)
...
n -gt f(n)
Dn
n1 -gt f(n1)
3
Divide and Conquer
Problem
decomposition
Subproblem1
Subproblem2
recursion
primitive
Subsolution1
Subsolution2
composition
Solution
4
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) )

5
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))
6
Different Problems Same pattern
7
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))
  • )
  • )
  • )

8
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))
  • )
  • )
  • )
  • )

9
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)
  • ) ) )

10
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.

11
  • (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))
  • )
  • ))

12
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))
  • )
  • ))

13
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
  • )
  • )
  • ))

14
Related problems Different Patterns
15
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

16
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

17
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

18
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

19
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

20
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)))

21
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.

22
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.

23
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

24
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

25
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

26
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.

27
  • (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))
  • )
  • )

28
  • (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
  • ))

29
  • (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))) )
  • ))

30
Examples
  • (ops 'x)
  • 0
  • (ops '( y z))
  • 1
  • (ops '(if x ( y z) ( x z)))
  • 2

31
  • (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))) ) )
About PowerShow.com