How to Run:
1. Compile the program using a C compiler (e.g., GCC, Clang, Visual C++).
   $ gcc -o main main.c

2. Execute the compiled binary to see the output.
   $ ./main

   
Functions implemented
1-Recursion method
2-Iterative method with an array
3- dynamic programming method

1-Recursion method
    advantages:
    It is easy to understand and implement.
    disadvantages:
    -It is inefficient as it involves repeated function calls and return values.
    -It is not recommended for large numbers. 

    
    Time complexity: O(2^n) 
    Space complexity:  O(n) 
This method is the most simple and easy to understand. It is also the most inefficient method. The time complexity of this method is O(2^n). This is because the function calls itself twice for every number. This method is not recommended for large numbers.

2-Iterative method with an array
    advantages:
    -It is efficient as it involves no function calls and return values.
    -It is recommended for large numbers.
    disadvantages:
    -It is difficult to understand and implement.
    -uses an array which takes up memory spaces
    -might cause Stack Overflow

    Time complexity: O(n)
    Space complexity:  O(n) 
    
3-dynamic programming method
    advantages:
    - It is efficient as it involves no function calls and return values.
    - avoides repeated calculations
    disadvantages:
    -might cause Stack Overflow
    -the array takes up memory space, For large values of n it might exceed the stack size.

    Time complexity: O(n)
    Space complexity:  O(n)