CIT 383: Administrative Scripting Recursion CIT 383: Administrative Scripting
CIT 383: Administrative Scripting Topics What is recursion? Recursive definitions. Examples. Writing a recursive function. Recursion in system administration. CIT 383: Administrative Scripting
CIT 383: Administrative Scripting Recursion Recursion is a programming technique in which a function calls itself. A recursive function must have both A base case in which the function computes a result without calling itself. One or more recursive cases where the function calls itself to compute the result. CIT 383: Administrative Scripting
Recursive Definitions How would you define a list of integers? 17, 42, 8, 97 We could define it by A LIST is an: integer or an: integer COMMA LIST We defined a LIST using itself. CIT 383: Administrative Scripting
Recursive Definitions integer COMMA LIST 17 , 42,8,97 integer COMMA LIST 42 , 8,97 integer COMMA LIST 8 , 97 integer 97 CIT 383: Administrative Scripting
Recursive Definitions The sum of the numbers 1 .. n is sum(1..n) is: n + sum(1..n-1) or: 1 if n is1 Ruby code: def sum(n) if n==1 1 else n + sum(n-1) end CIT 383: Administrative Scripting
CIT 383: Administrative Scripting sum(5) 5 sum sum(4) 4 sum sum(3) 3 sum sum(2) 2 sum sum(1) 1 sum CIT 383: Administrative Scripting
Counting list elements def count_list(list) if list.empty? else 1 + count_list(list[1..-1]) end CIT 383: Administrative Scripting
CIT 383: Administrative Scripting count_list([17, 42, 8, 97]) 4 count_list count_list([42, 8, 97]) 3 count_list count_list([8, 97]) 2 count_list count_list([8]) 1 count_list count_list() count_list CIT 383: Administrative Scripting
CIT 383: Administrative Scripting Adding list elements def sum_list(list) if list.empty? else list[0] + sum_list(list[1..-1]) end CIT 383: Administrative Scripting
Writing a Recursive Function Write the base case first. Recurse to a simpler case. Avoid using globals. CIT 383: Administrative Scripting
Write the base case first Every recursive function must have something it can do without recursion. There may be one or more base cases. Integers: base case usually occurs for 0 or 1 Arrays: base case usually occurs for [] Writing a base case is writing ordinary, non- recursive code. CIT 383: Administrative Scripting
Recurse to a simpler case Break recursive case into two parts A simpler problem (using a shorter array or smaller integer) of the same kind. Extra work done by the recursive case. Combine the results of the recursive work on the simpler problem and the extra work into a single solution. CIT 383: Administrative Scripting
Recursion in System Administration Searching the filesystem Examples: find file that matches string or filename Base cases: files Recursive cases: directories Spidering a web site Examples: check for broken links, archiving Base cases: documents Recursive cases: hyperlinks CIT 383: Administrative Scripting
CIT 383: Administrative Scripting References Michael Fitzgerald, Learning Ruby, O’Reilly, 2008. David Flanagan and Yukihiro Matsumoto, The Ruby Programming Language, O’Reilly, 2008. Hal Fulton, The Ruby Way, 2nd edition, Addison-Wesley, 2007. Dave Thomas with Chad Fowler and Andy Hunt, Programming Ruby, 2nd edition, Pragmatic Programmers, 2005. CIT 383: Administrative Scripting