recursion and functional programming

Download Recursion and Functional Programming

If you can't read please download the document

Upload: sathish316

Post on 13-Jun-2015

656 views

Category:

Technology


0 download

TRANSCRIPT

  • 1. Recursion - Secret sauce of Functional Programming

2. Imperative to Functional

  • Immutability
  • Intermediate state?

No Looping constructs

  • Iteration?

3. Scheme (dialect of Lisp)

  • atom
  • 42, foo

list

  • (foo bar)

4. (42 (foo bar)) s-expressions atom or list

  • 42

5. (foo bar) 6. (42 (foo bar)) 7. car, cdr

  • lat

8. ( foo bar baz ) 9. (car lat) 10. foo 11. (cdr lat) 12. ( bar baz ) 13. (car (cdr lat)) 14. bar 15. cons

  • (consbaz())

16. ( baz ) 17. (cons bar (baz)) 18. ( bar baz ) 19. (consfoo ( bar baz ) ) 20. ( foo bar baz ) 21. Primitive functions

  • null?
  • (null? ( quote () ) is #t

22. (null?foo ) is #f 23. (null? ( foo bar )) is #f atom?

  • (atom?foo ) is #t

24. (atom? ( foo bar )) is #f 25. (atom? ( quote () ) is #f eq?

  • (eq?foo foo ) is #t

26. (eq?foo bar ) is #f 27.

  • (member?foo( quote () )) is #f

28. (member?oops( foo bar baz )) is #f 29. (member?baz( foo bar baz )) is #t

    • foo == baz is #f
  • 30. (member? baz (bar baz))

31. bar == baz is #f 32. (member? baz (baz)) 33. baz == baz is #t member? 34. member? ( definemember? ( lambda(a lat) ( cond (( null?lat) #f) (else (or ( eq?( carlat) a) (member? a ( cdrlat)))) ))) 35. remove

  • (remove bar (foo bar baz))

36. (foo baz) ( defineremove ( lambda(a lat) ( cond (( null?lat) (quote ())) (( eq?( carlat) a) ( cdrlat)) (else ( cons( carlat) (remove a ( cdrlat)))) ))) 37. insertR

  • (insertR baz bar (foo bar))

38. (foo bar baz) ( defineinsertR ( lambda(new old lat) ( cond (( null?lat) (quote ())) (( eq?( carlat) old)( consold ( consnew ( cdrlat)))) (else ( cons( carlat) (insertR new old ( cdrlat)))) ))) 39. insertL

  • (insertL baz bar (foo bar))

40. (foo baz bar) ( defineinsertL ( lambda(new old lat) ( cond (( null?lat) (quote ())) (( eq?( carlat) old)( consnew ( consold ( cdrlat)))) (else ( cons( carlat) (insertR new old ( cdrlat)))) ))) 41. insert ( defineinsert ( lambdaseq ( lambda(new old lat) ( cond (( null?lat) (quote ())) (( eq?( carlat) old)( seqnew old lat)) (else ( cons( carlat) (insertR new old ( cdrlat)))) )))) 42. insertR, insertL using HOF ( defineseqR ( lambdanew old lat ( consold ( consnew ( cdrlat))) )) ( defineseqL ( lambdanew old lat ( consnew ( consold ( cdrlat))) )) ( defineinsertR(insert seqR)) ( defineinsertL(insert seqR)) 43. Arithmetic

  • add1

44. (add1 41) = 42 45. sub1 46. (sub1 43) = 42 47. zero? 48. (zero? 0) is #t 49. (zero? 42) is #f 50. Addition + 5 + 3 = 1 + (5 + 2) = 1 + 1 + (5 + 1) = 1 + 1 + 1 + (5 + 0) = 1 + 1 + 1 + 5 = 1 + 1 + 6 = 1 + 7 = 8 51. Addition + ( define+ ( lambda(n m) ( cond (( zero?m) n) (else ( add1(+ n (sub1 m)))) )))) 52. Multiplication X 5 * 3 = 5 + (5 * 2)= 5 + 5 + (5 * 1)= 5 + 5 + 5 + (5 * 0)= 5 + 5 + 5 + 0= 5 + 5 + 5= 5 + 10= 15 53. Multiplication X ( definex ( lambda(n m) ( cond (( zero?m) 0) (else (+ n (x n (sub1 m)))) )))) 54. Exponent ^ 5 ^ 3 = 5 x (5 ^ 2)= 5 x 5 x (5 ^ 1)= 5 x 5 x 5 x (5 ^ 0)= 5 x 5 x 5 x 1= 5 x 5 x 5= 5 x 25= 125 55. Exponent ^ ( define^ ( lambda(n m) ( cond (( zero?m) 1) (else (x n (^ n (sub1 m)))) )))) 56. Tuple addition

  • (addtup (1 2 3 4 5)) = 1 + (addtup (2 3 4 5)) = 1 + (2 + (addtup (3 4 5))) = 1 + (2 + (3 + (addtup (4 5)))) = 1 + (2 + (3 + (4 + (addtup (5))))) = 1 + (2 + (3 + (4 + (5 + (addtup ()))))) = 1 + (2 + (3 + (4 + (5 + 0)))) = 1 + (2 + (3 + (4 + 5))) = 1 + (2 + (3 + 9)) = 1 + (2 + 12) = 1 + 14 = 15

57. Tuple addition ( defineaddtup ( lambda(tup) ( cond (( null?tup) 0) (else (+ ( cartup) (addtup ( cdrtup)))) )))) 58. Questions? Further Reading