---
# System prepended metadata

title: Programming I Lab 10 - Recursion
tags: [IUG, Programming, Java]

---

---
description: In this lab, we will talk about a new idea that will help us with a lot of problems, the concept of recursion is pretty simple, but applying it without understanding it is pretty hard!
---
<h1 style='border: none'><center>Programming I Lab 10</center></h1>
<h2 style='border: none'><center>Recursion</center></h2>
<h5><center>The Islamic University of Gaza<br>Engineering Faculty<br>Department of Computer Engineering</center></h5>
<h6>Author: Mohammed Nafiz ALMadhoun<span style="float:right">2021/12/03</span></h6>

---

<p style='text-align:justify'>
In this lab, we will talk about a new idea that will help us with a lot of problems, the concept of recursion is pretty simple, but applying it without understanding it is pretty hard!
</p>

## Lab Objectives
- Understand the concept of recursion.
- Be able to write recursive methods.

## Recursion

The idea of recursion is pretty simple, imagine you have a method and inside this method, you call the same method.

So you will have a method that calls itself, this will lead to making the code easier to understand and write in some complex problems that require itself!

### Fibonacci Number Example

The Fibonacci sequence is a sequence starts like this:
<center> 

$0, 1, 1, 2, 3, 5, 8, 13, 21, 34, ...$
</center>

Each number in the sequence is just the sum of the previous two numbers, and the first and second number is our base, so they are just `0` and `1`, to write this in equations we can write:

$F_0 = 0$
$F_1 = 1$
$F_n = F_{n-2} + F_{n-1}$

#### Thinking about the code

The idea here is that you will select the base cases (Which will prevent the method from calling itself forever), then you will write the regular case.

```java=
public static int fib (int index) {
    if (index == 0)
        return 0;
    if (index == 1)
        return 1;
    
    return fib(index - 2) + fib(index - 1);
}
```

Notice that if the index is `0` or `1`, it will return a certain value, but if it's not `0` or `1`, it will return the summation of the two previous elements, which in the end will lead to getting the base values.

#### Calling Example

If we want to get the `fib(5)`, this will lead to calling the method `fib` multiple times like this:

```graphviz
digraph {
    node [shape=rect]
    
    fib_5 [label="fib(5)"]
    fib_3_0 [label="fib(3)"]
    fib_3_1 [label="fib(3)"]
    fib_2_0 [label="fib(2)"]
    fib_2_1 [label="fib(2)"]
    fib_2_2 [label="fib(2)"]
    fib_1_0 [label="fib(1)"]
    fib_1_1 [label="fib(1)"]
    fib_1_2 [label="fib(1)"]
    fib_1_3 [label="fib(1)"]
    fib_1_4 [label="fib(1)"]
    fib_0_0 [label="fib(0)"]
    fib_0_1 [label="fib(0)"]
    fib_0_2 [label="fib(0)"]
    fib_5 -> "fib(4)"
    fib_5 -> fib_3_0
    "fib(4)" -> fib_3_1
    "fib(4)" -> fib_2_2
    fib_2_2 -> fib_1_4
    fib_2_2 -> fib_0_2
    fib_3_0 -> fib_2_0
    fib_3_0 -> fib_1_0
    fib_2_0 -> fib_1_1
    fib_2_0 -> fib_0_0
    fib_3_1 -> fib_2_1
    fib_3_1 -> fib_1_2
    fib_2_1 -> fib_1_3
    fib_2_1 -> fib_0_1
}
```

<div style="page-break-after: always;"></div>

## Lab Tasks

### Task 1: Print the tree of Folders!

In this task, you will use `File` class, which will allow you to get all the files and folders in a certain folder using `listFiles` method, and you can check if this is a file or folder using the methods `isFile`, or `isDirectory`, for example:

```java=
public static void main(String[] args){
    File dir = new File("D:\\TA\\Programming");
    File[] list = dir.listFiles();
    for(File child : list){

        System.out.print(child.getName());
        if (child.isFile()) 
            System.out.println (" - File");
        else
            System.out.println (" - Folder");
    }
}
```

This code will print all the files and folders names in `D:\TA\Programming\` folder:
<center>

![Files and Folders in the Folder](https://i.imgur.com/uDH5aXa.png =400x)  
Files and Folders in the Folder
</center>

<center>
    
![Code Output](https://i.imgur.com/VvjgS6B.png =500x)
Code Output
</center>


Now, your task is to create a program that prints the tree of files in a certain folder, this will run recursivly because we don't know the depth of our tree.

<center>
    
![Task 1 Expected Output](https://i.imgur.com/eWTuTbn.png =500x)
</center>




###### tags: `Programming` `Java` `IUG`

<center>End Of Lab 10</center>