# Recursion - PowerPoint PPT Presentation

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

The Adobe Flash plugin is needed to view this content

Get the plugin now

View by Category
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
Category:
Tags:
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))
• ((eq? (car e) 'if)
• (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))
• ((if) ( (ops (cadr 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))) ) )