Another tutorial on recursion

Recursion in Java: Another beginners’ guide: Video Lecture 20

This post is a continuation of the previous video lecture on Recursion. The current post and the associated video lecture explain more on recursion in Java. We target the following problem — how to compute the summation of all the integer numbers between 1 and n, using recursion.

Recall from the previous post that we can go over a series of numbers using recursion. In the previous lecture, we used recursion to print all the integer numbers between 1 and n. The recursive method had a void return type. That is, the method did not return any value but the execution only. In the current post, the recursive method has an int return type.

The problem description

In the current post and the in the video, we apply a mathematical operation (summation) over a series of integer numbers. The recursive method in the current post has an integer return type. Basically, we are solving an exercise question that I provided in the previous post.

Again, the exercise question we are targeting is — Add all the numbers between 1 and n, of course, using recursion. A condition is: n>0.

We can write the series of integer numbers as:

1+2+3+4+… … … +n

Also, instead of writing 1+2+3+4+ …. +n, we can rewrite the series as

n+ ….. … … +4+ 3+ 2+1

That is, I can write the numbers backward, without changing the content of the series.

We can put some more values, in terms of n, here in the sequence. It is just inclusion of more terms of n in place of some of the dots. The series is the same as before.

n+(n-1)+(n-2)+ ….. … … +4+ 3+ 2+1

Note that, n is the largest number in the series. The next number is one less than n, which is (n-1). The number after that is 2 less than n. Therefore, it is (n-2), so and so forth. The numbers added in the series become smaller and smaller, ending with 4+3+2+1.

We do not add anything smaller than 1 in the series because there is a condition with the problem description that n>0. That means, any number in the series has to be greater than 0 because any number can be considered n since it is the variable to this problem.

The associated video lecture

The following video lecture contains a video-version of this post.

Recursion in Java (The second video lecture on recursion)

Looking at a series as a function

Let us say that the function that sums up all the integer numbers between 1 and n is called adder. adder is a function of n. We write it as the word adder, and then within parenthesis we write (n). That is the function is written as adder(n).

We write:

adder(n)=n+ ……… +4+ 3+ 2+1

Or, adder(n)=n+(n-1)+(n-2)+ ….. … … +4+ 3+ 2+1

An iterative solution

It is easy to write a method to implement the function adder(n) using a loop. Let us write a Java method that implements the iterative adder(n) function.

import java.util.Scanner;
class Summation{
  public static void main(String[] args){
    Scanner myScanner = new Scanner(System.in);
    System.out.print("What is the value of n: ");
    int n=myScanner.nextInt();
    int s=adder(n);
    System.out.println("The summation is: "+s);
  }
  static int adder(int n){
    int sum=0;
    int i;
    for (i=n; i>0 ; i=i-1 ){
      sum=sum+i;
    }
    return sum;
  }
}

Notice that the method adder in the code has a for-loop that helps iterating over all the integer numbers starting from n ending at 1. The loop adds each number to the sum variable during the iterations. The method returns the integer, sum, which holds the summation of all the numbers.

Note from a previous lecture on methods that we have to declare the adder method as a static one, because we are calling adder from the main method, which is a static one.

The output of the iterative solution

Let us save the file, compile it, and run it. Here is the output.

My Computer$ javac Summation.java 
My Computer$ java Summation
What is the value of n: 5
The summation is: 15
My Computer$ java Summation
What is the value of n: 100
The summation is: 5050
My Computer$

Notice that the user enters n equal 5 and the program prints 15, which is the summation 5+4+3+2+1.

The user enters 100 in place of n and the program prints 5050, which is the summation of all the integer numbers between 1 to 100.

The program is working perfectly. However, the problem description states that we should not use a loop, rather we should use recursion to solve this problem.

Therefore, let us change the method adder in such a way that it does not contain any loop.

Looking at a series as a recursive function

We already wrote an iterative method static int adder(int n), as our solution. We need to modify that method to get rid of the loop.

Here is the sequence we want to code:

n+(n-1)+(n-2) ….. … … +4+ 3+ 2+1

As explained before, at first we have n. The next number is one less than n, which is n-1. The number after that is 2 less than n. Therefore, it is n-2, so and so forth. Finally, the numbers added become smaller and smaller, such as, 4, 3, 2, and 1.

Mathematically,

adder(n)= n+(n-1)+(n-2)+ ….. … … +4+ 3+ 2+1

Now, notice that, the part that contains (n-1)+(n-2) ….. … … +4+ 3+ 2+1, can be considered adder(n-1).

Hence, we can write

adder(n)=n + adder(n-1)

adder(n-1) already has every term from n-1 down to 1 in it. Therefore, adding n with adder(n-1) will give adder(n).

As an example, when n=5:

adder(5)=5+4+3+2+1

With n=4, adder(4)=4+3+2+1

Therefore, we can replace the 4+3+2+1 part of the adder(5) equation, by adder(4)

That is, we can rewrite:

adder(5)=5+adder(4)

therefore, the general equation is:

adder(n)=n + adder(n-1)

Notice that the above mathematical definition of adder(n) is already a recursive equation. In the left side, we have the function adder with parameter n. In the right side we have the same function “adder” but with a smaller parameter, (n-1).

The problem description already states that n should be greater than 0. That means, if the recursion ever reaches to a parameter with value 0, we should return something that does not contribute to the summation. Something that does not contribute to a summation is zero. That mean, no harm is done if we add 0 to anything. Therefore, we will return a 0 instead of further going inside another recursion, when the parameter itself is 0. Hence we have a base case, which is returns 0 when n becomes smaller than 1.

Let us code the items we discussed.

The recursive solution to the problem

We need to delete the loop entirely from the method adder of the iterative solution. Let us keep the sum variable. The variable sum now should be n+adder(n-1) based on our discussion above. We are still returning sum, just like when we had a loop. The recursion will do the work of looping.

The recursive solution is as follows. We only made changes to the adder method.

import java.util.Scanner;
class Summation{
  public static void main(String[] args){
    Scanner myScanner = new Scanner(System.in);
    System.out.print("What is the value of n: ");
    int n=myScanner.nextInt();
    int s=adder(n);
    System.out.println("The summation is: "+s);
  }
  static int adder(int n){
    if (n<1){
      return 0;
    }
    int sum=0;
    sum=n + adder(n-1);
    return sum;
  }
}

The following part of the adder method is the base case.

    if (n<1){
      return 0;
    }

The line

sum=n + adder(n-1);

has the recursive call to adder, where (n-1) portion of the problem is solved. That is, one adder method performs one addition only; the rest of the additions are performed in other recursive calls.

The output of the recursive solution

The output of the recursive program is no different than its iterative version. Note that we solved the same problem using iterative and recursive solutions. Therefore, their outputs for the same n will be the same.

Tracing the recursive solution

I highly suggest that you watch the YouTube video above to view how I traced the program for n=3. After watching the video, trace the program with n=4 and n=5, as a practice.

As I said in the earlier lecture, many sophisticated algorithms in artificial intelligence rely on recursion because recursion automatically saves the local variables and the parameters in each call. If you trace the recursive version of the program we have written in the current post, you will see that n has different values in each call.

The reality of a recursive solution

Recursion is an elegant technique. The reality of recursion is that you will prefer an iterative solution over a recursive one if the iterative one is easy to code. Sometimes, recursive solutions are easier to code but can be slower than its iterative version.

The tradeoff between ease of coding and how fast your program runs is a topic that is generally discussed in an Algorithms course. The specific topic is known as algorithm complexity. May be, some day we will discuss about algorithm complexity too.

For now, let us keep practicing and developing our programming skills.

Concluding remarks

If you have not yet subscribed to Computing4All.com and to our YouTube channel, please do so to receive notifications on our new articles and videos. Let us know if you have any questions via comments below.

0 replies

Leave a Reply

Want to join the discussion?
Feel free to contribute!

Leave a Reply

Your email address will not be published. Required fields are marked *