
















Study with the several resources on Docsity
Earn points by helping other students or get them with a premium plan
Prepare for your exams
Study with the several resources on Docsity
Earn points to download
Earn points by helping other students or get them with a premium plan
In all programming language only syntax is different not the logic. This course discuss core concepts for many different programming language and techniques. Key points for this lecture are: Recursion, Parenthesis, Indirect Recursion, Recursive Functions, Anatomy of a Recursion, Parts of the Dumb, Improving the Dumb, Four Rules, Base Cases and Recursive Cases, Infinite Recursion
Typology: Slides
1 / 24
This page cannot be seen from the preview
Don't miss anything!

















An atom is a name or a number A list consists of: An open parenthesis, "(" Zero or more atoms or lists, and A close parenthesis, ")"
The mathematical definition of factorial is:
We can define this in Java as:
long factorial(long n) { if (n <= 1) return 1; else return n * factorial(n – 1); }
This is a recursive function because it calls itself
Recursive functions are completely legal in Java
1, if n <= 1 n * factorial(n-1) otherwise
factorial(n) is
Base case: does some work without making a recursive call
Recursive case: recurs with a simpler parameter
Extra work to convert the result of the recursive call into the result of this call
Base case: does some work without making a recursive call
Recursive case: recurs with a simpler parameter
Extra work to convert the result of the recursive call into the result of this call
Why should we have ask the array how big it is, then tell the method? Why can’t the method itself ask the array?
One or more base cases, where you compute the answer directly, without recursion One or more recursive cases, where you do part of the work, and recur with a simpler problem
Every recursive function must have some things it can do without
recursion
These are the simple, or base, cases
Test for these cases, and do them first
The important part here is testing before you recur; the actual work can be done in any order long factorial(long n) { if (n > 1) return n * factorial(n – 1); else return 1; } However, it’s usually better style to do the base cases first
This is just writing ordinary, nonrecursive code
The following is the recursive equivalent of an infinite loop:
int toInfinityAndBeyond(int x) { return toInfinityAndBeyond(x); }
This happened because we recurred with the same case!
While this is obviously foolish, infinite recursions can happen
by accident in more complex methods int collatz(int n) { if (n == 1) return 1; if (n % 2 == 0) return collatz(n / 2); else return collatz(3 * n - 1); }
Don’t modify and use non-local variables
int n = 10; ... int factorial() { if (n <= 1) return 1; else { n = n – 1; return (n + 1) * factorial(); } }
int total = 0; int[ ] b = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
int sum(int n) { if (n < 0) return total; else { total += b[n]; sum(n - 1); return total; } } System.out.println("Total is " + sum(9)); The global array b is being used, but not changed The global variable total is being changed, but not used (at least, not in any way that affects program execution) This program works, and can be understood
The previous method works, but it’s terrible style!
int sum(int n) { if (n < 0) return total; else { total += b[n]; sum(n - 1); return total; } }
What’s b? What’s total? Where do these come from? The method just isn’t very “self-contained” It might be acceptable if b and total are instance variables describing the state of this object—but that seems unlikely Some programmers prefer using getters and setters for all instance variables, even within the same class
Hence, it’s acting like a global variable (one accessible to all parts of the program)