DM536 Introduction to Programming. Peter Schneider-Kamp.

Similar documents
DM502 Programming A. Peter Schneider-Kamp.

DM536 Introduction to Programming. Peter Schneider-Kamp.

DM536 / DM550 Part 1 Introduction to Programming. Peter Schneider-Kamp.

DM536 / DM550 Part 1 Introduction to Programming. Peter Schneider-Kamp.

DM550/DM857 Introduction to Programming. Peter Schneider-Kamp

DM502 Programming A. Peter Schneider-Kamp.

DM536 Introduction to Programming. Peter Schneider-Kamp.

DM550/DM857 Introduction to Programming. Peter Schneider-Kamp

Functions and Recursion

DM550 / DM857 Introduction to Programming. Peter Schneider-Kamp

DM503 Programming B. Peter Schneider-Kamp.

DM550 / DM857 Introduction to Programming. Peter Schneider-Kamp

CS 1301 CS1 with Robots Summer 2007 Exam 1

DM550 Introduction to Programming part 2. Jan Baumbach.

Conditionals and Recursion. Python Part 4

Iteration. Chapter 7. Prof. Mauro Gaspari: Mauro Gaspari - University of Bologna -

STATS 507 Data Analysis in Python. Lecture 2: Functions, Conditionals, Recursion and Iteration

DM537 Object-Oriented Programming. Peter Schneider-Kamp.

Conditionals: Making Choices

RECURSION: n. SEE RECURSION 3

Chapter 7. Iteration. 7.1 Multiple assignment

CSC326 Python Imperative Core (Lec 2)

Control structure: Repetition - Part 2

DEBUGGING TIPS. 1 Introduction COMPUTER SCIENCE 61A

Chapter 1. Fundamentals of Higher Order Programming

1 Lexical Considerations

Python The way of a program. Srinidhi H Asst Professor Dept of CSE, MSRIT

ENVIRONMENT DIAGRAMS AND RECURSION 2

Here n is a variable name. The value of that variable is 176.

Python Boot Camp. Day 3

RECURSION 3. 1 Recursion COMPUTER SCIENCE 61A. June 30, 2016

\n is used in a string to indicate the newline character. An expression produces data. The simplest expression

Python, Part 2 CS 8: Introduction to Computer Science Lecture #4

DM550 Introduction to Programming part 2. Jan Baumbach.

Intro to Programming. Unit 7. What is Programming? What is Programming? Intro to Programming

Python for Informatics

COMP 202 Java in one week

Test #2 October 8, 2015

Iteration. # a and b are now equal # a and b are no longer equal Multiple assignment

Lexical Considerations

Pace University. Fundamental Concepts of CS121 1

Control Structures 1 / 17

Control Flow: Loop Statements

age = 23 age = age + 1 data types Integers Floating-point numbers Strings Booleans loosely typed age = In my 20s

ENGR 102 Engineering Lab I - Computation

Functions with Parameters and Return Values

Review. Primitive Data Types & Variables. String Mathematical operators: + - * / % Comparison: < > <= >= == int, long float, double boolean char

Chapter 4: Conditionals and Recursion

Chapter 4 Introduction to Control Statements

Selection statements. CSE 1310 Introduction to Computers and Programming Alexandra Stefan University of Texas at Arlington

Lexical Considerations

COMP284 Scripting Languages Lecture 15: JavaScript (Part 2) Handouts

EC 413 Computer Organization

Getting Started. Office Hours. CSE 231, Rich Enbody. After class By appointment send an . Michigan State University CSE 231, Fall 2013

Lecture Notes: CS 2370: Intro Programming Lecture Notes - Student Version

Course Outline. Introduction to java

GE PROBLEM SOVING AND PYTHON PROGRAMMING. Question Bank UNIT 1 - ALGORITHMIC PROBLEM SOLVING

CS1 Lecture 5 Jan. 26, 2018

>>> * *(25**0.16) *10*(25**0.16)

Chapter 4. Conditionals and recursion. 4.1 The modulus operator. 4.2 Conditional execution

Conditional Expressions and Decision Statements

ITERATION AND RECURSION 3

HUDSONVILLE HIGH SCHOOL COURSE FRAMEWORK

An introduction to Scheme

Chapter 1 Summary. Chapter 2 Summary. end of a string, in which case the string can span multiple lines.

Python review. 1 Python basics. References. CS 234 Naomi Nishimura

PRG PROGRAMMING ESSENTIALS. Lecture 2 Program flow, Conditionals, Loops

CONTROL AND HIGHER ORDER FUNCTIONS 1

COMP1730/COMP6730 Programming for Scientists. Data: Values, types and expressions.

Arithmetic and IO. 25 August 2017

Module 10: Imperative Programming, Modularization, and The Future

ICS 4U. Introduction to Programming in Java. Chapter 10 Notes

Expressions and Variables

CHAPTER 2: Introduction to Python COMPUTER PROGRAMMING SKILLS

The SPL Programming Language Reference Manual

How to Design Programs

learning objectives learn about variables, their types and their values learn about different number representations

CS1 Lecture 5 Jan. 25, 2019

RECURSION, RECURSION, (TREE) RECURSION! 2

Programming Training. Main Points: - Python Statements - Problems with selections.

Introduction to Computer Programming for Non-Majors

CS100: CPADS. Decisions. David Babcock / Don Hake Department of Physical Sciences York College of Pennsylvania

egrapher Language Reference Manual

Applied Programming and Computer Science, DD2325/appcs15 PODF, Programmering och datalogi för fysiker, DA7011

Downloaded from Chapter 2. Functions

The return Statement

Method Invocation. Zheng-Liang Lu Java Programming 189 / 226

Homework 3 COSE212, Fall 2018

Finding Pi: Applications of Loops, Random Numbers, Booleans CS 8: Introduction to Computer Science, Winter 2018 Lecture #6

Computer Programming. Basic Control Flow - Loops. Adapted from C++ for Everyone and Big C++ by Cay Horstmann, John Wiley & Sons

Mirage. Language Reference Manual. Image drawn using Mirage 1.1. Columbia University COMS W4115 Programming Languages and Translators Fall 2006

Introduction to Programming II W4260. Lecture 2

MEIN 50010: Python Flow Control

RECURSION 7. 1 Recursion COMPUTER SCIENCE 61A. October 15, 2012

A Problem. Loop-Body Returns. While-Loop Solution with a Loop-Body Return. 12. Logical Maneuvers. Typical While-Loop Solution 3/8/2016

Chapter 8. Statement-Level Control Structures

CMPT 120 Control Structures in Python. Summer 2012 Instructor: Hassan Khosravi

Introduction to Python (All the Basic Stuff)

RECURSION, RECURSION, (TREE) RECURSION! 3

CONTROL AND HIGHER ORDER FUNCTIONS 2

Transcription:

DM536 Introduction to Programming Peter Schneider-Kamp petersk@imada.sdu.dk! http://imada.sdu.dk/~petersk/dm536/!

DEFINING FUNCTIONS 2

Function Definitions functions are defined using the following grammar rule: <func.def> => def <function>(<arg 1 >,, <arg n >): <instr 1 >; ; <instr k > can be used to reuse code: Example: def pythagoras(): c = math.sqrt(a**2+b**2) print "Result:", c a = 3; b = 4; pythagoras() a = 7; b = 15; pythagoras() functions are values: type(pythagoras) 3

Functions Calling Functions functions can call other functions Example: def white(): print " #" * 8 def black(): print "# " * 8 def all(): all() white(); black(); white(); black() white(); black(); white(); black() 4

Executing Programs (Revisited) Program stored in a file (source code file) Instructions in this file executed top-to-bottom Interpreter executes each instruction Source Code Interpreter Input Output 5

Functions Calling Functions functions can call other functions Example: def white(): print " #" * 8 create new function variable white def black(): print "# " * 8 def all(): all() white(); black(); white(); black() white(); black(); white(); black() 6

Functions Calling Functions functions can call other functions Example: def white(): print " #" * 8 create new function variable black def black(): print "# " * 8 def all(): all() white(); black(); white(); black() white(); black(); white(); black() 7

Functions Calling Functions functions can call other functions Example: def white(): print " #" * 8 create new function variable all def black(): print "# " * 8 def all(): all() white(); black(); white(); black() white(); black(); white(); black() 8

Functions Calling Functions functions can call other functions Example: def white(): print " #" * 8 call function all def black(): print "# " * 8 def all(): all() white(); black(); white(); black() white(); black(); white(); black() 9

Functions Calling Functions functions can call other functions Example: def white(): print " #" * 8 call function white def black(): print "# " * 8 def all(): all() white(); black(); white(); black() white(); black(); white(); black() 10

Functions Calling Functions functions can call other functions Example: def white(): print " #" * 8 print " # # # # # # # #" def black(): print "# " * 8 def all(): all() white(); black(); white(); black() white(); black(); white(); black() 11

Functions Calling Functions functions can call other functions Example: def white(): print " #" * 8 call function black def black(): print "# " * 8 def all(): all() white(); black(); white(); black() white(); black(); white(); black() 12

Functions Calling Functions functions can call other functions Example: def white(): print " #" * 8 print "# # # # # # # # " def black(): print "# " * 8 def all(): all() white(); black(); white(); black() white(); black(); white(); black() 13

Functions Calling Functions functions can call other functions Example: def white(): print " #" * 8 call function white def black(): print "# " * 8 def all(): all() white(); black(); white(); black() white(); black(); white(); black() 14

Functions Calling Functions functions can call other functions Example: def white(): print " #" * 8 print " # # # # # # # #" def black(): print "# " * 8 def all(): all() white(); black(); white(); black() white(); black(); white(); black() 15

Functions Calling Functions functions can call other functions Example: def white(): print " #" * 8 # # # # # # # #! # # # # # # # #! # # # # # # # #! # # # # # # # #! # # # # # # # #! # # # # # # # #! # # # # # # # #! # # # # # # # #!! def black(): print "# " * 8 def all(): all() white(); black(); white(); black() white(); black(); white(); black() 16

Parameters and Arguments we have seen functions that need arguments: math.sqrt(x) computes square root of x math.log(x, base) computes logarithm of x w.r.t. base arguments are assigned to parameters of the function Example: def pythagoras(): c = math.sqrt(a**2+b**2) print "Result:", c a = 3; b = 4; pythagoras() a = 7; b = 15; pythagoras() 17

Parameters and Arguments we have seen functions that need arguments: math.sqrt(x) computes square root of x math.log(x, base) computes logarithm of x w.r.t. base arguments are assigned to parameters of the function Example: def pythagoras(a, b): c = math.sqrt(a**2+b**2) print "Result:", c a = 3; b = 4; pythagoras(a, b) a = 7; b = 15; pythagoras(a, b) 18

Parameters and Arguments we have seen functions that need arguments: math.sqrt(x) computes square root of x math.log(x, base) computes logarithm of x w.r.t. base arguments are assigned to parameters of the function Example: def pythagoras(a, b): c = math.sqrt(a**2+b**2) print "Result:", c pythagoras(3, 4) pythagoras(7, 15) 19

Parameters and Arguments we have seen functions that need arguments: math.sqrt(x) computes square root of x math.log(x, base) computes logarithm of x w.r.t. base arguments are assigned to parameters of the function Example: def pythagoras(a, b): c = math.sqrt(a**2+b**2) print "Result:", c pythagoras(3, 4) pythagoras(2**3-1, 2**4-1) 20

Parameters and Arguments we have seen functions that need arguments: math.sqrt(x) computes square root of x math.log(x, base) computes logarithm of x w.r.t. base arguments are assigned to parameters of the function Example: def pythagoras(a, b): c = math.sqrt(a**2+b**2) print "Result:", c pythagoras(3, 4) x = 2**3-1; y = 2**4-1 pythagoras(x, y) 21

Variables are Local parameters and variables are local local = only available in the function defining them Example: in module math: a local to pythagoras c local to pythagoras x,y local to main def sqrt(x): in our program: def pythagoras(a, b): c = math.sqrt(a**2+b**2) print "Result:", c x = 3; y =4; pythagoras(x, y) x local to math.sqrt b local to pythagoras 22

Stack Diagrams main x è 3 y è 4 pythagoras a è 3 b è 4 math.sqrt x è 25 23

Tracebacks stack structure printed on runtime error Example: def broken(x): print x / 0 def caller(a, b): broken(a**b) caller(2,5) Traceback (most recent call last): File "test.py", line 5, in <module> caller(2,5) File "test.py", line 4, in caller broken(a**b) File "test.py", line 2, in broken print x/0 ZeroDivisionError: integer division or modulo by zero 24

Return Values we have seen functions that return values: math.sqrt(x) returns the square root of x math.log(x, base) returns the logarithm of x w.r.t. base What is the return value of our function pythagoras(a, b)? special value None returned, if no return value given (void) declare return value using return statement: return <expr> Example: def pythagoras(a, b): c = math.sqrt(a**2+b**2) return c print pythagoras(3, 4) 25

Motivation for Functions functions give names to blocks of code easier to read easier to debug avoid repetition easier to make changes functions can be debugged separately easier to test easier to find errors functions can be reused (for other programs) easier to write new programs 26

Debugging Function Definitions make sure you are using latest files (save, then run python -i) biggest problem for beginners is indentation all lines on the same level must have the same indentation mixing spaces and tabs is very dangerous try to use only spaces a good editor helps! do not forget to use : at end of first line indent body of function definition by e.g. 4 spaces 27

TURTLE WORLD & INTERFACE DESIGN 28

Turtle World available from http://www.greenteapress.com/thinkpython/swampy/install.html basic elements of the library can be imported using from TurtleWorld import * w = TurtleWorld() creates new world w t = Turtle() creates new turtle t wait_for_user() can be used at the end of the program 29

Simple Repetition two basic commands to the turtle fd(t, 100) advances turtle t by 100 lt(t) turns turtle t 90 degrees to the left drawing a square requires 4x drawing a line and turning left fd(t,100); lt(t); fd(t,100); lt(t); fd(t,100); lt(t); fd(t,100); lt(t) simple repetition using for-loop for <var> in range(<expr>): <instr 1 >; <instr 2 > Example: for i in range(4): print i 30

Simple Repetition two basic commands to the turtle fd(t, 100) advances turtle t by 100 lt(t) turns turtle t 90 degrees to the left drawing a square requires 4x drawing a line and turning left fd(t,100); lt(t); fd(t,100); lt(t); fd(t,100); lt(t); fd(t,100); lt(t) simple repetition using for-loop for <var> in range(<expr>): <instr 1 >; <instr 2 > Example: for i in range(4): fd(t, 100) lt(t) 31

Encapsulation Idea: wrap up a block of code in a function documents use of this block of code allows reuse of code by using parameters Example: def square(t): for i in range(4): fd(t, 100) lt(t) square(t) u = Turtle(); rt(u); fd(u,10); lt(u); square(u) 32

Generalization square(t) can be reused, but size of square is fixed Idea: generalize function by adding parameters more flexible functionality more possibilities for reuse Example 1: def square(t, length): for i in range(4): fd(t, length) lt(t) square(t, 100) square(t, 50) 33

Generalization Example 2: replace square by regular polygon with n sides def square(t, length): for i in range(4): fd(t, length) lt(t) 34

Generalization Example 2: replace square by regular polygon with n sides def polygon(t, length): for i in range(4): fd(t, length) lt(t) 35

Generalization Example 2: replace square by regular polygon with n sides def polygon(t, n, length): for i in range(n): fd(t, length) lt(t) 36

Generalization Example 2: replace square by regular polygon with n sides def polygon(t, n, length): for i in range(n): fd(t, length) lt(t, 360/n) 37

Generalization Example 2: replace square by regular polygon with n sides def polygon(t, n, length): angle = 360/n for i in range(n): fd(t, length) lt(t, angle) 38

Generalization Example 2: replace square by regular polygon with n sides def polygon(t, n, length): angle = 360/n for i in range(n): fd(t, length) lt(t, angle) polygon(t, 4, 100) polygon(t, 6, 50) 39

Generalization Example 2: replace square by regular polygon with n sides def polygon(t, n, length): angle = 360/n for i in range(n): fd(t, length) lt(t, angle) polygon(t, n=4, length=100) polygon(t, n=6, length=50) 40

Generalization Example 2: replace square by regular polygon with n sides def polygon(t, n, length): angle = 360/n for i in range(n): fd(t, length) lt(t, angle) square(t, 100) 41

Generalization Example 2: replace square by regular polygon with n sides def polygon(t, n, length): angle = 360/n for i in range(n): fd(t, length) lt(t, angle) def square(t, length): polygon(t, 4, length) square(t, 100) 42

Interface Design Idea: interface = parameters + semantics + return value should be general (= easy to reuse) but as simple as possible (= easy to read and debug) Example: def circle(t, r): circumference = 2*math.pi*r n = 10 length = circumference / n polygon(t, n, length) circle(t, 10) circle(t, 100) 43

Interface Design Idea: interface = parameters + semantics + return value should be general (= easy to reuse) but as simple as possible (= easy to read and debug) Example: def circle(t, r, n): circumference = 2*math.pi*r # n = 10 length = circumference / n polygon(t, n, length) circle(t, 10, 10) circle(t, 100, 40) 44

Interface Design Idea: interface = parameters + semantics + return value should be general (= easy to reuse) but as simple as possible (= easy to read and debug) Example: def circle(t, r): circumference = 2*math.pi*r n = int(circumference / 3) + 1 length = circumference / n polygon(t, n, length) circle(t, 10) circle(t, 100) 45

Refactoring we want to be able to draw arcs Example: def arc(t, r, angle): arc_length = 2*math.pi*r*angle/360 n = int(arc_length / 3) + 1 step_length = arc_length / n step_angle = float(angle) / n for i in range(n): fd(t, step_length) lt(t, step_angle) 46

Refactoring we want to be able to draw arcs Example: def arc(t, r, angle): arc_length = 2*math.pi*r*angle/360 n = int(arc_length / 3) + 1 step_length = arc_length / n step_angle = float(angle) / n def polyline(t, n, length, angle): for i in range(n): fd(t, length) lt(t, angle) 47

Refactoring we want to be able to draw arcs Example: def arc(t, r, angle): arc_length = 2*math.pi*r*angle/360 n = int(arc_length / 3) + 1 step_length = arc_length / n step_angle = float(angle) / n polyline(t, n, step_length, step_angle) def polyline(t, n, length, angle): for i in range(n): fd(t, length) lt(t, angle) 48

Refactoring we want to be able to draw arcs Example: def polyline(t, n, length, angle): for i in range(n): fd(t, length) lt(t, angle) 49

Refactoring we want to be able to draw arcs Example: def polyline(t, n, length, angle): for i in range(n): fd(t, length) lt(t, angle) def polygon(t, n, length): angle = 360/n polyline(t, n, length, angle): 50

Refactoring we want to be able to draw arcs Example: def arc(t, r, angle): arc_length = 2*math.pi*r*angle/360 n = int(arc_length / 3) + 1 step_length = arc_length / n step_angle = float(angle) / n polyline(t, n, step_length, step_angle) 51

Refactoring we want to be able to draw arcs Example: def arc(t, r, angle): arc_length = 2*math.pi*r*angle/360 n = int(arc_length / 3) + 1 step_length = arc_length / n step_angle = float(angle) / n polyline(t, n, step_length, step_angle) def circle(t, r): arc(t, r, 360) 52

Simple Iterative Development first structured approach to develop programs: 1. write small program without functions 2. encapsulate code in functions 3. generalize functions (by adding parameters) 4. repeat steps 1 3 until functions work 5. refactor program (e.g. by finding similar code) copy & paste helpful reduces amount of typing no need to debug same code twice 53

Debugging Interfaces interfaces simplify testing and debugging 1. test if pre-conditions are given: do the arguments have the right type? are the values of the arguments ok? 2. test if the post-conditions are given: does the return value have the right type? is the return value computed correctly? 3. debug function, if pre- or post-conditions violated 54

CONDITIONAL EXECUTION 55

Boolean Expressions expressions whose value is either True or False logic operators for computing with Boolean values: x and y True if, and only if, x is True and y is True x or y True if (x is True or y is True) not x True if, and only if, x is False Python also treats numbers as Boolean expressions: 0 False any other number True Please, do NOT use this feature! 56

Relational Operators relational operators are operators, whose value is Boolean important relational operators are: Example True Example False x < y 23 < 42 "World" < "Hej!" x <= y 42 <= 42.0 int(math.pi) <= 2 x == y 42 == 42.0 type(2) == type(2.0) x >= y 42 >= 42 "Hej!" >= "Hello" x > y "World" > "Hej!" 42 > 42 remember to use == instead of = (assignment)! 57

Conditional Execution the if-then statement executes code only if a condition holds grammar rule: <if-then> => if <cond>: <instr 1 >; ; <instr k > Example: if x <= 42: print "not more than the answer" if x > 42: print "sorry - too much!" 58

Control Flow Graph Example: if x <= 42: print "not more than the answer" if x > 42: print "sorry - too much!" x <= 42 False x > 42 False True True print "not more " print "sorry - too " 59

Alternative Execution the if-then-else statement executes one of two code blocks grammar rule: <if-then-else> => if <cond>: <instr 1 >; ; <instr k > else: <instr 1 >; ; <instr k > Example: if x <= 42: print "not more than the answer" else: print "sorry - too much!" 60

Control Flow Graph Example: if x <= 42: print "not more than the answer" else: print "sorry - too much!" x <= 42 False True print "not more " print "sorry - too " 61

Chained Conditionals alternative execution a special case of chained conditionals grammar rules: <if-chained> => if <cond 1 >: <instr 1,1 >; ; <instr k1,1 > elif <cond 2 >: else: Example: if x > 0: print "positive" elif x < 0: print "negative" else: print "zero" <instr 1,m >; ; <instr km,m > 62

Control Flow Diagram Example: if x > 0: print "positive" elif x < 0: print "negative" else: print "zero" False x > 0 x < 0 True True False print "positive" print "negative" print "zero" 63

Nested Conditionals conditionals can be nested below conditionals: x = input() y = input() if x > 0: if y > 0: print "Quadrant 1" elif y < 0: print "Quadrant 4" else: print "positive x-axis" elif x < 0: if y > 0: print "Quadrant 2" elif y < 0: print "Quadrant 3" else: print "negative x-axis" else: print "y-axis" 64

RECURSION 65

Recursion a function can call other functions a function can call itself such a function is called a recursive function Example 1: def countdown(n): if n <= 0: print "Ka-Boooom!" else: print n, "seconds left!" countdown(n-1) countdown(3) 66

Stack Diagrams for Recursion main countdown n è 3 countdown n è 2 countdown n è 1 countdown n è 0 67

Recursion a function can call other functions a function can call itself such a function is called a recursive function Example 2: def polyline(t, n, length, angle): for i in range(n): fd(t, length) lt(t, angle) 68

Recursion a function can call other functions a function can call itself such a function is called a recursive function Example 2: def polyline(t, n, length, angle): if n > 0: fd(t, length) lt(t, angle) polyline(t, n-1, length, angle) 69

Infinite Recursion base case = no recursive function call reached we say the function call terminates Example 1: n == 0 in countdown / polyline infinite recursion = no base case is reached also called non-termination Example: def infinitely_often(): infinitely_often() Python has recursion limit 1000 ask sys.getrecursionlimit() 70

Keyboard Input so far we only know input() what happens when we enter Hello? input() treats all input as Python expression <expr> for string input, use raw_input() what happens when we enter 42? raw_input() treats all input as string both functions can take one argument prompt Example 1: a = input("first side: ") Example 2: name = raw_input("your name:\n") \n denotes a new line: print "Hello\nWorld\n!" 71

Debugging using Tracebacks error messages in Python give important information: where did the error occur? what kind of error occurred? unfortunately often hard to localize real problem Example: real problem error reported def determine_vat(base_price, vat_price): factor = base_price / vat_price reverse_factor = 1 / factor return reverse_factor - 1 print determine_vat(400, 500) 72

Debugging using Tracebacks error messages in Python give important information: where did the error occur? what kind of error occurred? unfortunately often hard to localize real problem Example: def determine_vat(base_price, vat_price): factor = float(base_price) / vat_price reverse_factor = 1 / factor return reverse_factor - 1 print determine_vat(400, 500) 73

FRUITFUL FUNCTIONS 74

Return Values so far we have seen only functions with one or no return sometimes more than one return makes sense Example 1: def sign(x): if x < 0: return -1 elif x == 0: return 0 else: return 1 75

Return Values so far we have seen only functions with one or no return sometimes more than one return makes sense Example 1: def sign(x): if x < 0: return -1 elif x == 0: return 0 return 1 important that all paths reach one return 76

Incremental Development Idea: test code while writing it Example: computing the distance between (x 1,y 1 ) and (x 2,y 2 ) def distance(x1, y1, x2, y2): print "x1 y1 x2 y2:", x1, y1, x2, y2 77

Incremental Development Idea: test code while writing it Example: computing the distance between (x 1,y 1 ) and (x 2,y 2 ) def distance(x1, y1, x2, y2): print "x1 y1 x2 y2:", x1, y1, x2, y2 dx = x2 - x1 # horizontal distance print "dx:", dx 78

Incremental Development Idea: test code while writing it Example: computing the distance between (x 1,y 1 ) and (x 2,y 2 ) def distance(x1, y1, x2, y2): print "x1 y1 x2 y2:", x1, y1, x2, y2 dx = x2 - x1 # horizontal distance print "dx:", dx dy = y2 - y1 print "dy:", dy # vertical distance 79

Incremental Development Idea: test code while writing it Example: computing the distance between (x 1,y 1 ) and (x 2,y 2 ) def distance(x1, y1, x2, y2): print "x1 y1 x2 y2:", x1, y1, x2, y2 dx = x2 - x1 # horizontal distance print "dx:", dx dy = y2 - y1 print "dy:", dy dxs = dx**2; dys = dy**2 print "dxs dys:", dxs, dys # vertical distance 80

Incremental Development Idea: test code while writing it Example: computing the distance between (x 1,y 1 ) and (x 2,y 2 ) def distance(x1, y1, x2, y2): print "x1 y1 x2 y2:", x1, y1, x2, y2 dx = x2 - x1 # horizontal distance dy = y2 - y1 # vertical distance dxs = dx**2; dys = dy**2 print "dxs dys:", dxs, dys 81

Incremental Development Idea: test code while writing it Example: computing the distance between (x 1,y 1 ) and (x 2,y 2 ) def distance(x1, y1, x2, y2): print "x1 y1 x2 y2:", x1, y1, x2, y2 dx = x2 - x1 # horizontal distance dy = y2 - y1 # vertical distance dxs = dx**2; dys = dy**2 print "dxs dys:", dxs, dys ds = dxs + dys # square of distance print "ds:", ds 82

Incremental Development Idea: test code while writing it Example: computing the distance between (x 1,y 1 ) and (x 2,y 2 ) def distance(x1, y1, x2, y2): print "x1 y1 x2 y2:", x1, y1, x2, y2 dx = x2 - x1 # horizontal distance dy = y2 - y1 # vertical distance dxs = dx**2; dys = dy**2 ds = dxs + dys # square of distance print "ds:", ds 83

Incremental Development Idea: test code while writing it Example: computing the distance between (x 1,y 1 ) and (x 2,y 2 ) def distance(x1, y1, x2, y2): print "x1 y1 x2 y2:", x1, y1, x2, y2 dx = x2 - x1 # horizontal distance dy = y2 - y1 # vertical distance dxs = dx**2; dys = dy**2 ds = dxs + dys # square of distance print "ds:", ds d = math.sqrt(ds) # distance print d 84

Incremental Development Idea: test code while writing it Example: computing the distance between (x 1,y 1 ) and (x 2,y 2 ) def distance(x1, y1, x2, y2): print "x1 y1 x2 y2:", x1, y1, x2, y2 dx = x2 - x1 # horizontal distance dy = y2 - y1 # vertical distance dxs = dx**2; dys = dy**2 ds = dxs + dys # square of distance d = math.sqrt(ds) # distance print d 85

Incremental Development Idea: test code while writing it Example: computing the distance between (x 1,y 1 ) and (x 2,y 2 ) def distance(x1, y1, x2, y2): print "x1 y1 x2 y2:", x1, y1, x2, y2 dx = x2 - x1 # horizontal distance dy = y2 - y1 # vertical distance dxs = dx**2; dys = dy**2 ds = dxs + dys # square of distance d = math.sqrt(ds) # distance print d return d 86

Incremental Development Idea: test code while writing it Example: computing the distance between (x 1,y 1 ) and (x 2,y 2 ) def distance(x1, y1, x2, y2): dx = x2 - x1 # horizontal distance dy = y2 - y1 # vertical distance dxs = dx**2; dys = dy**2 ds = dxs + dys # square of distance d = math.sqrt(ds) # distance return d 87

Incremental Development Idea: test code while writing it Example: computing the distance between (x 1,y 1 ) and (x 2,y 2 ) def distance(x1, y1, x2, y2): dx = x2 - x1 # horizontal distance dy = y2 - y1 # vertical distance return math.sqrt(dx**2 + dy**2) 88

Incremental Development Idea: test code while writing it 1. start with minimal function 2. add functionality piece by piece 3. use variables for intermediate values 4. print those variables to follow your progress 5. remove unnecessary output when function is finished 89

Composition function calls can be arguments to functions direct consequence of arguments being expressions Example: area of a circle from center and peripheral point def area(radius): return math.pi * radius**2 def area_from_points(xc, yc, xp, yp): return area(distance(xc, yc, xp, yp)) 90

Boolean Functions boolean functions = functions that return True or False useful e.g. as <cond> in a conditional execution Example: def divides(x, y): if y / x * x == y: # remainder of integer division is 0 return True return False 91

Boolean Functions boolean functions = functions that return True or False useful e.g. as <cond> in a conditional execution Example: def divides(x, y): if y % x == 0: # remainder of integer division is 0 return True return False 92

Boolean Functions boolean functions = functions that return True or False useful e.g. as <cond> in a conditional execution Example: def divides(x, y): return y % x == 0 93

Boolean Functions boolean functions = functions that return True or False useful e.g. as <cond> in a conditional execution Example: def divides(x, y): return y % x == 0 def even(x): return divides(2, x) 94

Boolean Functions boolean functions = functions that return True or False useful e.g. as <cond> in a conditional execution Example: def divides(x, y): return y % x == 0 def even(x): return divides(2, x) def odd(x): return not divides(2, x) 95

Boolean Functions boolean functions = functions that return True or False useful e.g. as <cond> in a conditional execution Example: def divides(x, y): return y % x == 0 def even(x): return divides(2, x) def odd(x): return not even(x) 96

RECURSION: SEE RECURSION 97

Recursion is Complete so far we know: values of type integer, float, string arithmetic expressions (recursive) function definitions (recursive) function calls conditional execution input/output ALL possible programs can be written using these elements! we say that we have a Turing complete language 98

Factorial in mathematics, the factorial function is defined by 0! = 1 n! = n * (n-1)! such recursive definitions can trivially be expressed in Python Example: def factorial(n): if n == 0: return 1 recurse = factorial(n-1) result = n * recurse return result x = factorial(3) 99

Stack Diagram for Factorial main factorial n è 3 factorial n è 2 factorial n è 1 factorial n è 0 100

Stack Diagram for Factorial main factorial n è 3 factorial n è 2 factorial factorial n è 1 n è 0 1 101

Stack Diagram for Factorial main factorial n è 3 factorial n è 2 factorial factorial n è 1 recurse è 1 n è 0 1 102

Stack Diagram for Factorial main factorial n è 3 factorial n è 2 factorial factorial n è 1 recurse è 1 result è 1 n è 0 1 103

Stack Diagram for Factorial main factorial n è 3 factorial factorial factorial n è 2 n è 1 recurse è 1 result è 1 n è 0 1 1 104

Stack Diagram for Factorial main factorial n è 3 factorial factorial factorial n è 2 recurse è 1 n è 1 recurse è 1 result è 1 n è 0 1 1 105

Stack Diagram for Factorial main factorial n è 3 factorial factorial factorial n è 2 recurse è 1 result è 2 n è 1 recurse è 1 result è 1 n è 0 1 1 106

Stack Diagram for Factorial main factorial factorial factorial factorial n è 3 n è 2 recurse è 1 result è 2 n è 1 recurse è 1 result è 1 n è 0 2 1 1 107

Stack Diagram for Factorial main factorial factorial factorial factorial n è 3 recurse è 2 n è 2 recurse è 1 result è 2 n è 1 recurse è 1 result è 1 n è 0 2 1 1 108

Stack Diagram for Factorial main factorial factorial factorial factorial n è 3 recurse è 2 result è 6 n è 2 recurse è 1 result è 2 n è 1 recurse è 1 result è 1 n è 0 2 1 1 109

Stack Diagram for Factorial main factorial factorial factorial factorial n è 3 recurse è 2 result è 6 n è 2 recurse è 1 result è 2 n è 1 recurse è 1 result è 1 n è 0 6 2 1 1 110

Stack Diagram for Factorial main factorial factorial factorial factorial x è 6 n è 3 recurse è 2 result è 6 n è 2 recurse è 1 result è 2 n è 1 recurse è 1 result è 1 n è 0 6 2 1 1 111

Leap of Faith following the flow of execution difficult with recursion alternatively take the leap of faith (induction) Example: def factorial(n): if n == 0: return 1 recurse = factorial(n-1) result = n * recurse return result x = factorial(3) check the base case assume recursive call is correct check the step case 112

Control Flow Diagram Example: def factorial(n): factorial(n) if n == 0: return 1 recurse = factorial(n-1) n == 0 False result = n * recurse return result recurse = factorial(n-1) True result = n * recurse return result return 1 113