Recursion Factorial 6 654321 Factorial 75 Factorial 75

  • Slides: 52
Download presentation
Recursion

Recursion

Factorial! 6! = 6*5*4*3*2*1

Factorial! 6! = 6*5*4*3*2*1

Factorial! 75! = ? ? ?

Factorial! 75! = ? ? ?

Factorial! 75! = 75*74!

Factorial! 75! = 75*74!

Factorial! 75! = 75*74! Defined in terms of itself

Factorial! 75! = 75*74! Defined in terms of itself

Factorial! 75! = 75*74! To solve this problem, we need to figure out 74!

Factorial! 75! = 75*74! To solve this problem, we need to figure out 74!

Factorial! 74! = 74*73! 75! = 75*74! To solve this problem, we need to

Factorial! 74! = 74*73! 75! = 75*74! To solve this problem, we need to figure out 73!

Factorial! 73! = 73*72! 74! = 74*73! 75! = 75*74! To solve this problem,

Factorial! 73! = 73*72! 74! = 74*73! 75! = 75*74! To solve this problem, we need to figure out 72! When would it stop?

Factorial! In general… n! = n*(n-1)!

Factorial! In general… n! = n*(n-1)!

Recursion • When a method calls itself – Easy to identify – Going to

Recursion • When a method calls itself – Easy to identify – Going to create “clones” of the function – Usually, the clone has a smaller problem to work • Requirements – Must have the recursive call – Must have a terminating condition – Must make progress towards terminating

int factorial (int n) { if (n == 1) { return 1; } else

int factorial (int n) { if (n == 1) { return 1; } else { return n * factorial(n-1); } } void main () { int f = factorial(4); }

static int factorial (int n) { Console. Write. Line(n); if (n == 1) {

static int factorial (int n) { Console. Write. Line(n); if (n == 1) { return 1; } else { int result = n * factorial(n-1); Console. Write. Line(n); return result; } } void main () { int f = factorial(4); Console. Write. Line(f); }

static int factorial (int n) { Console. Write. Line(n); if (n == 1) {

static int factorial (int n) { Console. Write. Line(n); if (n == 1) { return 1; } else { int result = n * factorial(n-1); Console. Write. Line(n); return result; } } void main () { int f = factorial(4); Console. Write. Line(f); } function stack

static int factorial (int n) { Console. Write. Line(n); if (n == 1) {

static int factorial (int n) { Console. Write. Line(n); if (n == 1) { return 1; } else { int result = n * factorial(n-1); Console. Write. Line(n); return result; } } void main () { int f = factorial(4); Console. Write. Line(f); } main f = factorial(4)

n == 4 static int factorial (int n) { Console. Write. Line(n); if (n

n == 4 static int factorial (int n) { Console. Write. Line(n); if (n == 1) { return 1; } else { int result = n * factorial(n-1); Console. Write. Line(n); return result; } } void main () { int f = factorial(4); Console. Write. Line(f); } fact(4) main f = factorial(4)

n == 4 static int factorial (int n) { Console. Write. Line(n); if (n

n == 4 static int factorial (int n) { Console. Write. Line(n); if (n == 1) { return 1; } else { int result = n * factorial(n-1); Console. Write. Line(n); return result; } } void main () { int f = factorial(4); Console. Write. Line(f); } fact(4) main f = factorial(4)

Output 4 n == 4 static int factorial (int n) { Console. Write. Line(n);

Output 4 n == 4 static int factorial (int n) { Console. Write. Line(n); if (n == 1) { return 1; } else { int result = n * factorial(n-1); Console. Write. Line(n); return result; } } void main () { int f = factorial(4); Console. Write. Line(f); } fact(4) main f = factorial(4)

Output 4 n == 4 static int factorial (int n) { Console. Write. Line(n);

Output 4 n == 4 static int factorial (int n) { Console. Write. Line(n); if (n == 1) { return 1; } else { int result = n * factorial(n-1); Console. Write. Line(n); return result; } } void main () { int f = factorial(4); Console. Write. Line(f); } fact(4) main f = factorial(4)

Output 4 n == 4 static int factorial (int n) { Console. Write. Line(n);

Output 4 n == 4 static int factorial (int n) { Console. Write. Line(n); if (n == 1) { return 1; } else { int result = n * factorial(n-1); Console. Write. Line(n); return result; } } void main () { int f = factorial(4); Console. Write. Line(f); } fact(4) main f = factorial(4)

Output 4 n == 4 static int factorial (int n) { Console. Write. Line(n);

Output 4 n == 4 static int factorial (int n) { Console. Write. Line(n); if (n == 1) { return 1; } else { int result = n * factorial(n-1); Console. Write. Line(n); return result; } } void main () { int f = factorial(4); Console. Write. Line(f); } fact(4) result = 4 * factorial(3) main f = factorial(4)

Output 4 n == 4 static int factorial (int n) { Console. Write. Line(n);

Output 4 n == 4 static int factorial (int n) { Console. Write. Line(n); if (n == 1) { return 1; } else { int result = n * factorial(n-1); Console. Write. Line(n); return result; } } Pending Work! void main () { int f = factorial(4); Console. Write. Line(f); } fact(4) result = 4 * factorial(3) main f = factorial(4)

Output 4 n == 3 static int factorial (int n) { Console. Write. Line(n);

Output 4 n == 3 static int factorial (int n) { Console. Write. Line(n); if (n == 1) { return 1; } else { int result = n * factorial(n-1); Console. Write. Line(n); return result; } } void main () { int f = factorial(4); Console. Write. Line(f); } fact(3) fact(4) result = 4 * factorial(3) main f = factorial(4)

Output 4 3 n == 3 static int factorial (int n) { Console. Write.

Output 4 3 n == 3 static int factorial (int n) { Console. Write. Line(n); if (n == 1) { return 1; } else { int result = n * factorial(n-1); Console. Write. Line(n); return result; } } void main () { int f = factorial(4); Console. Write. Line(f); } fact(3) fact(4) result = 4 * factorial(3) main f = factorial(4)

Output 4 3 n == 3 static int factorial (int n) { Console. Write.

Output 4 3 n == 3 static int factorial (int n) { Console. Write. Line(n); if (n == 1) { return 1; } else { int result = n * factorial(n-1); Console. Write. Line(n); return result; } } void main () { int f = factorial(4); Console. Write. Line(f); } fact(3) fact(4) result = 4 * factorial(3) main f = factorial(4)

Output 4 3 n == 3 static int factorial (int n) { Console. Write.

Output 4 3 n == 3 static int factorial (int n) { Console. Write. Line(n); if (n == 1) { return 1; } else { int result = n * factorial(n-1); Console. Write. Line(n); return result; } } void main () { int f = factorial(4); Console. Write. Line(f); } fact(3) result = 3 * factorial(2) fact(4) result = 4 * factorial(3) main f = factorial(4)

Output 4 3 n == 3 static int factorial (int n) { Console. Write.

Output 4 3 n == 3 static int factorial (int n) { Console. Write. Line(n); if (n == 1) { return 1; } else { int result = n * factorial(n-1); Console. Write. Line(n); return result; } } Pending Work! void main () { int f = factorial(4); Console. Write. Line(f); } fact(3) result = 3 * factorial(2) fact(4) result = 4 * factorial(3) main f = factorial(4)

Output n == 2 4 3 static int factorial (int n) { Console. Write.

Output n == 2 4 3 static int factorial (int n) { Console. Write. Line(n); if (n == 1) { return 1; } else { int result = n * factorial(n-1); Console. Write. Line(n); return result; } } fact(2) void main () { fact(3) result = 3 * factorial(2) int f = factorial(4); Console. Write. Line(f); fact(4) result = 4 * factorial(3) } main f = factorial(4)

Output n == 2 4 3 2 static int factorial (int n) { Console.

Output n == 2 4 3 2 static int factorial (int n) { Console. Write. Line(n); if (n == 1) { return 1; } else { int result = n * factorial(n-1); Console. Write. Line(n); return result; } } fact(2) void main () { fact(3) result = 3 * factorial(2) int f = factorial(4); Console. Write. Line(f); fact(4) result = 4 * factorial(3) } main f = factorial(4)

Output n == 2 4 3 2 static int factorial (int n) { Console.

Output n == 2 4 3 2 static int factorial (int n) { Console. Write. Line(n); if (n == 1) { return 1; } else { int result = n * factorial(n-1); Console. Write. Line(n); return result; } } fact(2) void main () { fact(3) result = 3 * factorial(2) int f = factorial(4); Console. Write. Line(f); fact(4) result = 4 * factorial(3) } main f = factorial(4)

Output n == 2 static int factorial (int n) { Console. Write. Line(n); if

Output n == 2 static int factorial (int n) { Console. Write. Line(n); if (n == 1) { return 1; } else { int result = n * factorial(n-1); Console. Write. Line(n); return result; } } fact(2) void main () { fact(3) int f = factorial(4); Console. Write. Line(f); fact(4) } main 4 3 2 result = 2 * factorial(1) result = 3 * factorial(2) result = 4 * factorial(3) f = factorial(4)

Output n == 2 static int factorial (int n) { Console. Write. Line(n); if

Output n == 2 static int factorial (int n) { Console. Write. Line(n); if (n == 1) { return 1; } else { int result = n * factorial(n-1); Console. Write. Line(n); return result; } } Pending Work! fact(2) void main () { fact(3) int f = factorial(4); Console. Write. Line(f); fact(4) } main 4 3 2 result = 2 * factorial(1) result = 3 * factorial(2) result = 4 * factorial(3) f = factorial(4)

Output n == 1 static int factorial (int n) { Console. Write. Line(n); if

Output n == 1 static int factorial (int n) { Console. Write. Line(n); if (n == 1) { return 1; } else { int result = n * factorial(n-1); Console. Write. Line(n); return result; } fact(1) } fact(2) void main () { fact(3) int f = factorial(4); Console. Write. Line(f); fact(4) } main 4 3 2 result = 2 * factorial(1) result = 3 * factorial(2) result = 4 * factorial(3) f = factorial(4)

Output n == 1 static int factorial (int n) { Console. Write. Line(n); if

Output n == 1 static int factorial (int n) { Console. Write. Line(n); if (n == 1) { return 1; } else { int result = n * factorial(n-1); Console. Write. Line(n); return result; } fact(1) } fact(2) void main () { fact(3) int f = factorial(4); Console. Write. Line(f); fact(4) } main 4 3 2 1 result = 2 * factorial(1) result = 3 * factorial(2) result = 4 * factorial(3) f = factorial(4)

Output n == 1 static int factorial (int n) { Console. Write. Line(n); if

Output n == 1 static int factorial (int n) { Console. Write. Line(n); if (n == 1) { return 1; } else { int result = n * factorial(n-1); Console. Write. Line(n); return result; } fact(1) } fact(2) void main () { fact(3) int f = factorial(4); Console. Write. Line(f); fact(4) } main 4 3 2 1 result = 2 * factorial(1) result = 3 * factorial(2) result = 4 * factorial(3) f = factorial(4)

We “terminated” n == 1 static int factorial (int n) { Console. Write. Line(n);

We “terminated” n == 1 static int factorial (int n) { Console. Write. Line(n); if (n == 1) { return 1; } else { int result = n * factorial(n-1); Console. Write. Line(n); return result; } fact(1) } fact(2) void main () { fact(3) int f = factorial(4); Console. Write. Line(f); fact(4) } main Output 4 3 2 1 return 1 result = 2 * factorial(1) result = 3 * factorial(2) result = 4 * factorial(3) f = factorial(4)

Collapse the stack… static int factorial (int n) { Console. Write. Line(n); if (n

Collapse the stack… static int factorial (int n) { Console. Write. Line(n); if (n == 1) { return 1; } else { int result = n * factorial(n-1); Console. Write. Line(n); return result; } fact(1) } fact(2) void main () { fact(3) int f = factorial(4); Console. Write. Line(f); fact(4) } main Output 4 3 2 1 return 1 result = 2 * factorial(1) result = 3 * factorial(2) result = 4 * factorial(3) f = factorial(4)

Collapse the stack… static int factorial (int n) { Console. Write. Line(n); if (n

Collapse the stack… static int factorial (int n) { Console. Write. Line(n); if (n == 1) { return 1; } else { int result = n * factorial(n-1); Console. Write. Line(n); return result; } fact(1) } fact(2) void main () { fact(3) int f = factorial(4); Console. Write. Line(f); fact(4) } main Output 4 3 2 1 return 1 result = 2 * factorial(1) result = 3 * factorial(2) result = 4 * factorial(3) f = factorial(4)

Collapse the stack… n == 2 static int factorial (int n) { Console. Write.

Collapse the stack… n == 2 static int factorial (int n) { Console. Write. Line(n); if (n == 1) { return 1; } else { int result = n * factorial(n-1); Console. Write. Line(n); return result; } } fact(2) void main () { fact(3) int f = factorial(4); Console. Write. Line(f); fact(4) } main Output 4 3 2 1 result = 2 * 1 result = 3 * factorial(2) result = 4 * factorial(3) f = factorial(4)

Collapse the stack… n == 2 static int factorial (int n) { Console. Write.

Collapse the stack… n == 2 static int factorial (int n) { Console. Write. Line(n); if (n == 1) { return 1; } else { int result = n * factorial(n-1); Console. Write. Line(n); return result; } } fact(2) void main () { fact(3) int f = factorial(4); Console. Write. Line(f); fact(4) } main Output 4 3 2 1 2 result = 2 * 1 = 2 result = 3 * factorial(2) result = 4 * factorial(3) f = factorial(4)

Collapse the stack… n == 2 static int factorial (int n) { Console. Write.

Collapse the stack… n == 2 static int factorial (int n) { Console. Write. Line(n); if (n == 1) { return 1; } else { int result = n * factorial(n-1); Console. Write. Line(n); return result; } } fact(2) void main () { fact(3) int f = factorial(4); Console. Write. Line(f); fact(4) } main Output 4 3 2 1 2 result = 2 * 1 = 2 result = 3 * factorial(2) result = 4 * factorial(3) f = factorial(4)

Collapse the stack… n == 2 static int factorial (int n) { Console. Write.

Collapse the stack… n == 2 static int factorial (int n) { Console. Write. Line(n); if (n == 1) { return 1; } else { int result = n * factorial(n-1); Console. Write. Line(n); return result; } } fact(2) void main () { fact(3) int f = factorial(4); Console. Write. Line(f); fact(4) } main Output 4 3 2 1 2 result = 2 * 1 = 2 result = 3 * factorial(2) result = 4 * factorial(3) f = factorial(4)

Collapse the stack… n == 2 static int factorial (int n) { Console. Write.

Collapse the stack… n == 2 static int factorial (int n) { Console. Write. Line(n); if (n == 1) { return 1; } else { int result = n * factorial(n-1); Console. Write. Line(n); return result; } } fact(2) void main () { fact(3) int f = factorial(4); Console. Write. Line(f); fact(4) } main Output 4 3 2 1 2 result = 2 * 1 = 2 result = 3 * factorial(2) result = 4 * factorial(3) f = factorial(4)

Collapse the stack… Output n == 3 static int factorial (int n) { Console.

Collapse the stack… Output n == 3 static int factorial (int n) { Console. Write. Line(n); if (n == 1) { return 1; } else { int result = n * factorial(n-1); Console. Write. Line(n); return result; } } void main () { int f = factorial(4); Console. Write. Line(f); } 4 3 2 1 2 fact(3) result = 3 * 2 = 6 fact(4) result = 4 * factorial(3) main f = factorial(4)

Collapse the stack… Output n == 3 static int factorial (int n) { Console.

Collapse the stack… Output n == 3 static int factorial (int n) { Console. Write. Line(n); if (n == 1) { return 1; } else { int result = n * factorial(n-1); Console. Write. Line(n); return result; } } void main () { int f = factorial(4); Console. Write. Line(f); } 4 3 2 1 2 3 fact(3) result = 3 * 2 = 6 fact(4) result = 4 * factorial(3) main f = factorial(4)

Collapse the stack… Output n == 3 static int factorial (int n) { Console.

Collapse the stack… Output n == 3 static int factorial (int n) { Console. Write. Line(n); if (n == 1) { return 1; } else { int result = n * factorial(n-1); Console. Write. Line(n); return result; } } void main () { int f = factorial(4); Console. Write. Line(f); } 4 3 2 1 2 3 fact(3) result = 3 * 2 = 6 fact(4) result = 4 * factorial(3) main f = factorial(4)

Collapse the stack… Output n == 3 static int factorial (int n) { Console.

Collapse the stack… Output n == 3 static int factorial (int n) { Console. Write. Line(n); if (n == 1) { return 1; } else { int result = n * factorial(n-1); Console. Write. Line(n); return result; } } void main () { int f = factorial(4); Console. Write. Line(f); } 4 3 2 1 2 3 fact(3) result = 3 * 2 = 6 fact(4) result = 4 * factorial(3) main f = factorial(4)

Collapse the stack… Output n == 4 static int factorial (int n) { Console.

Collapse the stack… Output n == 4 static int factorial (int n) { Console. Write. Line(n); if (n == 1) { return 1; } else { int result = n * factorial(n-1); Console. Write. Line(n); return result; } } void main () { int f = factorial(4); Console. Write. Line(f); } 4 3 2 1 2 3 fact(4) result = 4 * 6 = 24 main f = factorial(4)

Collapse the stack… Output n == 4 static int factorial (int n) { Console.

Collapse the stack… Output n == 4 static int factorial (int n) { Console. Write. Line(n); if (n == 1) { return 1; } else { int result = n * factorial(n-1); Console. Write. Line(n); return result; } } void main () { int f = factorial(4); Console. Write. Line(f); } 4 3 2 1 2 3 4 fact(4) result = 4 * 6 = 24 main f = factorial(4)

Collapse the stack… Output n == 4 static int factorial (int n) { Console.

Collapse the stack… Output n == 4 static int factorial (int n) { Console. Write. Line(n); if (n == 1) { return 1; } else { int result = n * factorial(n-1); Console. Write. Line(n); return result; } } void main () { int f = factorial(4); Console. Write. Line(f); } 4 3 2 1 2 3 4 fact(4) result = 4 * 6 = 24 main f = factorial(4)

Collapse the stack… Output n == 4 static int factorial (int n) { Console.

Collapse the stack… Output n == 4 static int factorial (int n) { Console. Write. Line(n); if (n == 1) { return 1; } else { int result = n * factorial(n-1); Console. Write. Line(n); return result; } } void main () { int f = factorial(4); Console. Write. Line(f); } 4 3 2 1 2 3 4 fact(4) result = 4 * 6 = 24 main f = factorial(4)

Collapse the stack… Output n == 4 static int factorial (int n) { Console.

Collapse the stack… Output n == 4 static int factorial (int n) { Console. Write. Line(n); if (n == 1) { return 1; } else { int result = n * factorial(n-1); Console. Write. Line(n); return result; } } 4 3 2 1 2 3 4 void main () { int f = factorial(4); Console. Write. Line(f); } main f = 24

Collapse the stack… Output n == 4 static int factorial (int n) { Console.

Collapse the stack… Output n == 4 static int factorial (int n) { Console. Write. Line(n); if (n == 1) { return 1; } else { int result = n * factorial(n-1); Console. Write. Line(n); return result; } } 4 3 2 1 2 3 4 24 void main () { int f = factorial(4); Console. Write. Line(f); } main f = 24