Lecture4:decomposition and abstraction through functions;introduction to recursion function decomposition abstraction and recursion
Functions function
- Block up into modules decomposition into modules
- Suppress detail ignoring details
- Create "New primitives" how to think about creating primitives
W3school python functions
#example code for finding Square roots before x = 16 ans = 0 if x >= 0 : while ans* Ans < X:ans = ans + 1 print "ans = ' , ans if Ans*ans! = x: print x, " is not a perfect square ' else : print anselse : Print x,
- def keyword
- Function_name (formal parameters) function name (formal parameter)
- return keyword
- None-special value
#example code for finding square roots def sqrt(x): "" " Returns the square root of x, if X is a perfect square. Prints an error message and returns None otherwise "" "Ans =0 ifX >=0: whileAns*ans < X:ans = ans +1 ifAns*ans! = x:PrintX' is not a perfect square ' return None Else:returnAnsElse:PrintX' is a negative number ' return None
Local binding does not affect global binding:
Local bindings (local variables) do not affect global bindings (variables):
def f(x): x=x+1return x>>>x=3>>>z = f(x) >>>print x3 >>>print z4
Farmyard Problem Farm issues:
- Heads, legs
- Numpig + Numchicken = 20 number of pigs + number of chickens = 20
- 4 *numpig + 2*numchicken = 56
def solve(Numlegs, numheads): forNumchicksinchRange0, Numheads +1): Numpigs = numheads-numchicks Totlegs =4*numpigs +2*numchicksifTotlegs = = Numlegs:return(Numpigs, Numchicks)return(None,None) def Barnyard():Heads = Int (Raw_input (' Enter number of heads: ')) legs = Int (Raw_input (' Enter number of legs: ')) pigs, chickens = solve (legs, heads)ifPigs = =None:Print ' There is no solution ' Else:Print ' Number of pigs: ', pigsPrint ' Number of chickens: ', chickens
The farmer also kept the spider:
def solve1(Numlegs, numheads): forNumspidersinchRange0, Numheads +1): forNumchicksinchRange0, Numheads-numspiders +1): Numpigs = numheads-numchicks-numspiders Totlegs =4*numpigs +2*numchicks +8*numspidersifTotlegs = = Numlegs:return(Numpigs, Numchicks, Numspiders)return(None,None,None) def barnYard1():Heads = Int (Raw_input (' Enter number of heads: ')) legs = Int (Raw_input (' Enter number of legs: ')) pigs, chickens, spiders = solve1 (legs, heads)ifPigs = =None:Print ' There is no solution ' Else:Print ' Number of pigs: ', pigsPrint ' Number of chickens: ', chickensPrint ' Number of spiders: ', spiders
Improved: Output all the solutions:
def solve2(Numlegs, numheads):Solutionfound =False forNumspidersinchRange0, Numheads +1): forNumchicksinchRange0, Numheads-numspiders +1): Numpigs = numheads-numchicks-numspiders Totlegs =4*numpigs +2*numchicks +8*numspidersifTotlegs = = Numlegs:Print ' Number of pigs: '+ STR (numpigs) +', ',Print ' Number of chickens: '+str (numchicks) +', ',Print ' Number of spiders: ', Numspiders solutionfound =True if notSolutionfound:Print ' There is no solution. '
Recursion recursion
- Base Case–break problem into simplest possible solution to break the problem down into the simplest solution
- Inductive step, or the recursive step induction, recursive steps: Break problem to a simpler version of the same problem and some other STE Ps
# string is palindrome eg. "ABCBA" def Ispalindrome (s) : "" "Returns True if S is a Palindrome and False otherwise "" " if Len (s) <= 1 : return true else : return s[0 ] = = S[-1 ] and ispalindrome (S[1 :-< span class= "Hljs-number" >1 ])
# 付波纳切fibonacci数列def fib(x): """Return fibonacci of x, where x is a non-negative int""" if0or1return1 elsereturn fib(x-1) + fib(x-2)
MIT public class: Introduction to Computer science and programming Python Note 4 function decomposition abstraction and recursion