Top Banner
1 CSE 21 Intro to Computing II Functions (continued) and Recursion 1
28

CSE 21 Introduction to Computing II...How to Write a Recursive Function 9 Step 1 - Write and define the recursive Function Header Your main choices are the Return Type and Parameters

Nov 06, 2020

Download

Documents

dariahiddleston
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Page 1: CSE 21 Introduction to Computing II...How to Write a Recursive Function 9 Step 1 - Write and define the recursive Function Header Your main choices are the Return Type and Parameters

1

CSE 21

Intro to Computing II

Functions (continued) and Recursion

1

Page 2: CSE 21 Introduction to Computing II...How to Write a Recursive Function 9 Step 1 - Write and define the recursive Function Header Your main choices are the Return Type and Parameters

Week of 09/24 - Lecture #4-5 (09/26), Lab #5 Week of 10/01 - Lecture #6 (10/01), Lab #6 Week of 10/08 - Midterm Review (10/10), Lab #7, Project 1 Due Week of 10/15 - Midterm (10/17), NO LAB

Schedule

2

Due on Monday October 8th at midnight

Project #1

Wednesday October 17th, in class, 50 minutes long Closed book, no notes, no computers Covers CSE020, anything from the labs, anything from lecture

Up to last lecture (lecture #6) and last lab (Lab #7) Will have a review on October 10th Extended Office Hours from TAs and Lecturer

Midterm

Page 3: CSE 21 Introduction to Computing II...How to Write a Recursive Function 9 Step 1 - Write and define the recursive Function Header Your main choices are the Return Type and Parameters

Same concept as name overloading ◦ Use same names, but JAVA knows which is which

Function Overloading ◦ Two or more functions that have Same modifiers (i.e., public static)

Same return type (i.e., void)

Same function name (i.e., print)

Different number of parameters and/or type

Examples ◦ public static void print()

◦ public static void print(String name)

◦ public static void print(String name, int grade)

◦ public static void print(String[] name, int[] grade)

◦ public static void print(String city, String zip)

◦ public static void print(String city, int zip)

◦ public static int print(String city)

Function Overloading

3

Page 4: CSE 21 Introduction to Computing II...How to Write a Recursive Function 9 Step 1 - Write and define the recursive Function Header Your main choices are the Return Type and Parameters

public static int getAmount(Scanner input, String name) { // 1

System.out.print("Enter the amount of " + name + ": ");

int amount = input.nextInt();

return amount;

}

public static void getAmount(Scanner input, String[] names, int[] amounts) { // 2

for (int i = 0; i < names.length; i++) {

System.out.print("Enter the amount of " + names[i] + " : ");

amounts[i] = input.nextInt();

}

}

public static void main(String[] args) {

Scanner input = new Scanner(System.in);

int sharp = getAmount(input, "Sharp");

int brie = getAmount(input, "Brie");

int swiss = getAmount(input, "Swiss");

getAmount(input, names, amounts);

Function Overloading Example

2 input parameters: Scanner + String

3 input parameters: Scanner + String pointer + int pointer

2 arguments: Scanner + String

3 arguments: Scanner + String[] + int[]

Order of the Types determine the function call 4

Page 5: CSE 21 Introduction to Computing II...How to Write a Recursive Function 9 Step 1 - Write and define the recursive Function Header Your main choices are the Return Type and Parameters

getAmount(input, “Random”); ◦ Scanner + String // Match 1

getAmount(“Random”, input); ◦ String + Scanner // Don’t match

getAmount(input, names[0]); ◦ Scanner + String // Match 1

getAmount(input, names); ◦ Scanner + String[] // Don’t match

getAmount(input, names, amounts); ◦ Scanner + String[] + int[] // Match 2

getAmount(input, amounts, names); ◦ Scanner + int[] + String[] // Don’t match

getAmount(input,names[0],amounts[0]); ◦ Scanner + String + int // Don’t match

getAmount(input, names, new int[MAXCHEESE]); ◦ Scanner + String[] + int[] // Match 2

getAmount(input, names, prices); ◦ Scanner + String[] + double[] // Don’t match

Matching Function Calls

public static int getAmount(Scanner input, String name) { // 1

public static void getAmount(Scanner input, String[] names, int[] amounts) { // 2

5

Page 6: CSE 21 Introduction to Computing II...How to Write a Recursive Function 9 Step 1 - Write and define the recursive Function Header Your main choices are the Return Type and Parameters

Can call a function anywhere in your code ◦ From the main function (as I have shown in class)

◦ From another function

Example ◦ public static void main(){

◦ greet(“Ben”);

◦ }

◦ public static void welcomeMsg() {

◦ System.out.println(“Welcome to CSE021”);

◦ }

◦ public static void greet(String name) {

◦ welcomeMsg();

◦ System.out.println(“Greetings, ” + name + “!”);

◦ }

Calling Functions Outside main

OUTPUT:

Welcome to CSE021

Greetings, Ben!

6

Page 7: CSE 21 Introduction to Computing II...How to Write a Recursive Function 9 Step 1 - Write and define the recursive Function Header Your main choices are the Return Type and Parameters

Can we have a function that calls itself? ◦ Yes!

What happens in that case?

Let’s try it out… ◦ public static void main(){

◦ greet(“Ben”);

◦ }

◦ public static void welcomeMsg() {

◦ System.out.println(“Welcome to CSE021”);

◦ welcomeMsg();

◦ }

◦ public static void greet(String name) {

◦ welcomeMsg();

◦ System.out.println(“Greetings, ” + name + “!”);

◦ }

This Begs the Question…

OUTPUT:

Welcome to CSE021

Welcome to CSE021

Welcome to CSE021

Welcome to CSE021

Infinite “Loop”!

7

Page 8: CSE 21 Introduction to Computing II...How to Write a Recursive Function 9 Step 1 - Write and define the recursive Function Header Your main choices are the Return Type and Parameters

We introduce a new term, Recursive Function ◦ A function that calls itself

Difficult concept to grasp ◦ Function behaves exactly the same when it is calling itself

◦ Recursion is similar to loops

◦ Function parameters are used to stop the recursion

Easy to get infinite loop

◦ Study and Practice are both necessary

Understanding/Exploiting Recursion ◦ Follow a series of steps

◦ Trace the code and function calls

Recursive Function

8

Page 9: CSE 21 Introduction to Computing II...How to Write a Recursive Function 9 Step 1 - Write and define the recursive Function Header Your main choices are the Return Type and Parameters

Divide the problem into smaller sub-problems ◦ Divide and conquer

◦ Same concept as using functions

The solved small problems together solve the big problem

Theoretical Example ◦ Problem: print the elements of an array

◦ Sub-problem: print one element of an array

◦ Solving the sub-problem “array.length” times will print the array

◦ The sub-problem is what goes inside the function, which calls itself

◦ Needs to make sure we have a stopping condition

Without one, we get an infinite loop

Practical Example ◦ public static void print(int[] arr, int indexToPrint) {

◦ if(indexToPrint==arr.length) return;

◦ System.out.println(arr[indexToPrint]);

◦ print(arr, indexToPrint+1);

◦ }

How to Write a Recursive Function

9

Page 10: CSE 21 Introduction to Computing II...How to Write a Recursive Function 9 Step 1 - Write and define the recursive Function Header Your main choices are the Return Type and Parameters

Step 1 - Write and define the recursive Function Header ◦ Your main choices are the Return Type and Parameters

Step 2 – Write out a sample/example Function Call ◦ Make sure that the call will do what you want “in theory”

◦ You might realize that your Function Header is incorrect

Step 3 – Think when you want to stop the recursion ◦ This is similar to the condition in of a loop and is called Stopping Condition

◦ You will use it to stop the function from calling itself

◦ Without a Stopping Condition we will have an infinite loop

Step 4 – Write the function body ◦ This is what the function does

Step 5 – Make the function call itself ◦ The function call will solve a smaller problem than the current one

◦ This is done by changing one or more parameters

◦ Similar to a for or a while loop

Writing Recursive Functions

10

Page 11: CSE 21 Introduction to Computing II...How to Write a Recursive Function 9 Step 1 - Write and define the recursive Function Header Your main choices are the Return Type and Parameters

Problem Statement: print an entire array

Sub-problem: print an element in the array

Step 1 - Write and define the recursive Function Header ◦ public static void print(int[] arr, int indexToPrint)

Step 2 – Write out a sample/example Function Call ◦ int[] arr={1,5,9,6,7}; print(arr, 0);

Step 3 – Think when you want to stop the recursion ◦ if(indexToPrint==arr.length) return;

Step 4 – Write the function body ◦ System.out.println(arr[indexToPrint]);

Step 5 – Make the function call itself ◦ print(arr, indexToPrint+1);

Final Function ◦ public static void print(int[] arr, int indexToPrint) {

◦ if(indexToPrint==arr.length) return;

◦ System.out.println(arr[indexToPrint]);

◦ print(arr, indexToPrint+1);

◦ }

Example #1 of the Process

11

Page 12: CSE 21 Introduction to Computing II...How to Write a Recursive Function 9 Step 1 - Write and define the recursive Function Header Your main choices are the Return Type and Parameters

To make sure our recursive function works, we must trace it

Final Function ◦ public static void print(int[] arr, int indexToPrint) {

◦ if(indexToPrint==arr.length) return;

◦ System.out.println(arr[indexToPrint]);

◦ print(arr, indexToPrint+1);

◦ }

Call from main ◦ int[] arr={1,5,9,6,7}; print(arr, 0);

Trace Output

print(arr, 0) 1

print(arr, 1) 5

print(arr, 2) 9

print(arr, 3) 6

print(arr, 4) 7

print(arr, 5)

Tracing Example #1

12

Page 13: CSE 21 Introduction to Computing II...How to Write a Recursive Function 9 Step 1 - Write and define the recursive Function Header Your main choices are the Return Type and Parameters

Problem Statement: print an entire array in reverse order

Sub-problem: print an element in the array

Step 1 - Write and define the recursive Function Header ◦ public static void print(int[] arr, int indexToPrint)

Step 2 – Write out a sample/example Function Call ◦ int[] arr={1,5,9,6,7}; print(arr, arr.length-1);

Step 3 – Think when you want to stop the recursion ◦ if(indexToPrint==-1) return;

Step 4 – Write the function body ◦ System.out.println(arr[indexToPrint]);

Step 5 – Make the function call itself ◦ print(arr, indexToPrint-1);

Final Function ◦ public static void print(int[] arr, int indexToPrint) {

◦ if(indexToPrint==-1) return;

◦ System.out.println(arr[indexToPrint]);

◦ print(arr, indexToPrint-1);

◦ }

Example #2 of the Process

13

Page 14: CSE 21 Introduction to Computing II...How to Write a Recursive Function 9 Step 1 - Write and define the recursive Function Header Your main choices are the Return Type and Parameters

To make sure our recursive function works, we must trace it

Final Function ◦ public static void print(int[] arr, int indexToPrint) {

◦ if(indexToPrint==-1) return;

◦ System.out.println(arr[indexToPrint]);

◦ print(arr, indexToPrint-1);

◦ }

Call from main ◦ int[] arr={1,5,9,6,7}; print(arr, arr.length-1);

Trace Output

print(arr, 4) 7

print(arr, 3) 6

print(arr, 2) 9

print(arr, 1) 5

print(arr, 0) 1

print(arr, -1)

Tracing Example #2

14

Page 15: CSE 21 Introduction to Computing II...How to Write a Recursive Function 9 Step 1 - Write and define the recursive Function Header Your main choices are the Return Type and Parameters

◦ public static void print(int[] arr, int indexToPrint) {

◦ if(indexToPrint==arr.length) return;

◦ System.out.println(arr[indexToPrint]);

◦ print(arr, indexToPrint+1);

◦ }

◦ public static void print(int[] arr, int indexToPrint) {

◦ if(indexToPrint==arr.length) return;

◦ print(arr, indexToPrint+1);

◦ System.out.println(arr[indexToPrint]);

◦ }

◦ Call from main: int[] arr={1,5,9,6,7}; print(arr, 0);

Trace Output

print(arr, 0) 7

print(arr, 1) 6

print(arr, 2) 9

print(arr, 3) 5

print(arr, 4) 1

print(arr, 5)

The Order Matters…

Prints in Order

Prints in

Reverse Order!

15

Page 16: CSE 21 Introduction to Computing II...How to Write a Recursive Function 9 Step 1 - Write and define the recursive Function Header Your main choices are the Return Type and Parameters

Problem Statement: sum all integers between 1 and max

Sub-problem: sum one integer with the rest of the numbers

Step 1 - Write and define the recursive Function Header ◦ public static int sumAll(int max)

Step 2 – Write out a sample/example Function Call ◦ int sum = sumAll(5); // sum should be set to 5+4+3+2+1=15

Step 3 – Think when you want to stop the recursion ◦ if(max==0) return 0; // You have to return 0, because your return type is int!

Step 4 – Write the function body ◦ The function body will be empty for this one, the sum is in the return statement

Step 5 – Make the function call itself ◦ return sumAll(max-1) + max;

Final Function ◦ public static int sumAll(int max) {

◦ if(max==0) return 0;

◦ return sumAll(max-1) + max;

◦ }

Example #3 of the Process

16

Page 17: CSE 21 Introduction to Computing II...How to Write a Recursive Function 9 Step 1 - Write and define the recursive Function Header Your main choices are the Return Type and Parameters

Declaration and Invocation

public static long sumAll(int max) { // Declaration System.out.println("sumAll " + n);

if (max == 0) return 0; else return sumAll(max - 1) + n; }

public static void main(String[] args) {

System.out.println("sumAll output for 5 is " + sumAll(5)); System.out.println("sumAll output for 10 is " + sumAll(10)); System.out.println("sumAll output for 20 is " + sumAll(20)); System.out.println("sumAll output for 15 is " + sumAll(15)); System.out.println();

}

17

Page 18: CSE 21 Introduction to Computing II...How to Write a Recursive Function 9 Step 1 - Write and define the recursive Function Header Your main choices are the Return Type and Parameters

Tracing sumAll(2) public static long sumAll(2) { System.out.println("sumAll " + 2);

if (2 == 0) return 0; else return 2 + sumAll(2 - 1); }

OUTPUT: sumAll 2

18

Page 19: CSE 21 Introduction to Computing II...How to Write a Recursive Function 9 Step 1 - Write and define the recursive Function Header Your main choices are the Return Type and Parameters

Tracing sumAll(2) public static long sumAll(2) { System.out.println("sumAll " + 2);

if (2 == 0) return 0; else return 2 + sumAll(2 - 1); }

OUTPUT: sumAll 2 sumAll 1

public static long sumAll(1) { System.out.println("sumAll " + 1);

if (1 == 0) return 0; else return 1 + sumAll(1 - 1); }

Invoke

19

Page 20: CSE 21 Introduction to Computing II...How to Write a Recursive Function 9 Step 1 - Write and define the recursive Function Header Your main choices are the Return Type and Parameters

Tracing sumAll(2) public static long sumAll(2) { System.out.println("sumAll " + 2);

if (2 == 0) return 0; else return 2 + sumAll(2 - 1); }

OUTPUT: sumAll 2 sumAll 1 sumAll 0

public static long sumAll(1) { System.out.println("sumAll " + 1);

if (1 == 0) return 0; else return 1 + sumAll(1 - 1); }

Invoke

public static long sumAll(0) { System.out.println("sumAll " + 0);

if (0 == 0) return 0;

Invoke

20

Page 21: CSE 21 Introduction to Computing II...How to Write a Recursive Function 9 Step 1 - Write and define the recursive Function Header Your main choices are the Return Type and Parameters

Tracing sumAll(2) public static long sumAll(int 2) { System.out.println("sumAll " + 2);

if (2 == 0) return 0; else return 2 + sumAll(2 - 1); }

OUTPUT: sumAll 2 sumAll 1 sumAll 0

public static long sumAll(int 1) { System.out.println("sumAll " + 1);

if (1 == 0) return 0; else return 1 + 0; }

Invoke

21

Page 22: CSE 21 Introduction to Computing II...How to Write a Recursive Function 9 Step 1 - Write and define the recursive Function Header Your main choices are the Return Type and Parameters

Tracing sumAll(2) public static long sumAll(int 2) { System.out.println("sumAll " + 2);

if (2 == 0) return 0; else return 2 + 1; }

OUTPUT: sumAll 2 sumAll 1 sumAll 0 sumAll of 2 is 3

public static void main(String[] args) {

System.out.println("sumAll of 2 is " +sumAll(2)); }

22

Page 23: CSE 21 Introduction to Computing II...How to Write a Recursive Function 9 Step 1 - Write and define the recursive Function Header Your main choices are the Return Type and Parameters

Any iterative solution can be converted to a recursive solution

Any recursive solution can be converted to an iterative solution

Iterative

◦ subTotal = 0;

◦ for (int i = 1; i <= max ; i++) {

◦ subTotal += i;

◦ }

Recursive

◦ public static int sumAll(int n) {

◦ if (n == 0)

◦ return 0;

◦ else

◦ return sumAll(n-1) + n;

Iterative vs Recursive

23

Page 24: CSE 21 Introduction to Computing II...How to Write a Recursive Function 9 Step 1 - Write and define the recursive Function Header Your main choices are the Return Type and Parameters

Missing the stopping condition ◦ public static int sumAll(int max) {

◦ return sumAll(max-1) + max;

◦ }

◦ Infinite Loop!

Wrong Function Call - no guarantee that the function will exit ◦ public static int sumAll(int max) {

◦ if(max==0) return 0;

◦ return sumAll(max-1) + max;

◦ }

◦ Calling the function with sumAll(-1) will result in an Infinite Loop!

Too many function calls ◦ Your computer has limited memory

◦ You will run out of space when calling sumAll(50000)

◦ Should not happen in this class!

Takes too much time to compute ◦ Should not happen in this class!

Common Recursion Mistakes

24

Page 25: CSE 21 Introduction to Computing II...How to Write a Recursive Function 9 Step 1 - Write and define the recursive Function Header Your main choices are the Return Type and Parameters

Problem Statement: compute the factorial of a number

Sub-problem: multiply one integer with the rest of the numbers

Step 1 - Write and define the recursive Function Header ◦ public static int Fact(int number)

Step 2 – Write out a sample/example Function Call ◦ int factorial = Fact(5); // factorial should be set to 5*4*3*2*1=120

Step 3 – Think when you want to stop the recursion ◦ if(number==1) return 1; // You have to return 1, your return type is int!

Step 4 – Write the function body ◦ The function body is empty; the multiplication is in the return statement

Step 5 – Make the function call itself ◦ return Fact(number-1) * number;

Final Function ◦ public static int Fact(int number) {

◦ if(number==1) return 1;

◦ return Fact(number-1) * number;

◦ }

Example #4 of the Process

25

Page 26: CSE 21 Introduction to Computing II...How to Write a Recursive Function 9 Step 1 - Write and define the recursive Function Header Your main choices are the Return Type and Parameters

Tracing Fact(5)

Fact(5)

Fact(4)

Fact(3)

Fact(2)

Fact(1)

Fact(1)

Return 1

Fact (2)

Return 1*2

Fact (3)

Return 2*3

Fact (4)

Return 6*4

Fact (5)

Return 24*5

public static int Fact(int number)

{

if(number==1) return 1;

return Fact(number-1) * number;

}

Call from main: Fact(5)

26

Page 27: CSE 21 Introduction to Computing II...How to Write a Recursive Function 9 Step 1 - Write and define the recursive Function Header Your main choices are the Return Type and Parameters

Problem Statement: compute the fibonacci of a number

Sub-problem: add the previous two numbers together

Step 1 - Write and define the recursive Function Header ◦ public static int Fib(int number)

Step 2 – Write out a sample/example Function Call ◦ int fibonacci = Fib(5); // fibonacci should be set to 2+3=5

Step 3 – Think when you want to stop the recursion ◦ if(number==0) return 0;

◦ If(number==1) return 1;

Step 4 – Write the function body

Step 5 – Make the function call itself ◦ return Fib(number-1) + Fib(number-2);

Final Function ◦ public static int Fib(int number) {

◦ if(number==1) return 1;

◦ return Fib(number-1) * number;

◦ }

Example #5 of the Process

27

Page 28: CSE 21 Introduction to Computing II...How to Write a Recursive Function 9 Step 1 - Write and define the recursive Function Header Your main choices are the Return Type and Parameters

Fib(5)

Fib(4)1

Fib(3)1

Fib(2)1 Fib(1)1

Fib(2)2

Fib(3)2

Fib(2)3 Fib(1)2

Tracing Fib(5)

28