Skip to content

Commit 30230dc

Browse files
Implemented recursive & iterative fibonacci (CoffeelessProgrammer#9 IP)
1 parent 3dca3ce commit 30230dc

File tree

7 files changed

+114
-5
lines changed

7 files changed

+114
-5
lines changed

Algorithms/README.md

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
# Algorithms
22

33
## Core
4-
- [ ] Recursion
4+
- [X] Recursion
55
- [ ] Dynamic Programming
66
- [ ] Comparison Sorting
77
- [ ] *Merge Sort*
@@ -16,4 +16,7 @@
1616
- [ ] Depth First Search (DFS)
1717

1818
## Resources
19-
- [Visualizing Data Structures & Algorithms](https://visualgo.net/en)
19+
- [Visualizing Data Structures & Algorithms](https://visualgo.net/en)
20+
21+
### Recursion
22+
- [Tail Call Optimization: ES6](https://2ality.com/2015/06/tail-call-optimization.html)

Algorithms/Recursion/Basics.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
function inception(repeat: number): string {
22
// 1. Base Case(s)
33
if (repeat === 0) return 'Done!\n'; // Base Case(s) must be written first in method
4-
// 2. Input Validation
5-
if (repeat < 1) return 'Too small!\n'; // Input validation must occur after base case(s)
4+
// 2?. Input Validation
5+
if (repeat < 1) return 'Too small!\n'; // Input validation should occur after base case(s)
66

77
console.log('Counter:', repeat);
88

Algorithms/Recursion/Fibonacci.ts

Lines changed: 106 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,106 @@
1+
// ---------------- Fibonacci Sequence ----------------
2+
// 0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144...
3+
4+
// Time Complexity: O(2^n) Space Complexity: O(2^n)
5+
function fibonacciRecursive(nthElement: number): number | any {
6+
// Base Cases
7+
if (nthElement === 1) return 0;
8+
if (nthElement === 2) return 1;
9+
//Input Validation
10+
if (nthElement < 1) return undefined;
11+
12+
// Recursive Call: The nth element equals the sum of the previous 2 elements.
13+
return fibonacciRecursive(nthElement-2) + fibonacciRecursive(nthElement-1);
14+
}
15+
16+
// Time Complexity: O(n) Space Complexity: O(1)
17+
function fibonacciIterative(nthElement: number): number | undefined {
18+
if (nthElement < 1) return undefined;
19+
else nthElement = Math.floor(nthElement);
20+
21+
let previous = 0;
22+
let current = 1;
23+
24+
if (nthElement === 1) return previous;
25+
if (nthElement === 2) return current;
26+
27+
let fibonacci: number = 0;
28+
29+
for (let i = 3; i <= nthElement; ++i) {
30+
fibonacci = previous + current;
31+
previous = current;
32+
current = fibonacci;
33+
}
34+
35+
return fibonacci;
36+
}
37+
38+
function validateFibonacciInput(nthElement: number) {
39+
return nthElement>0;
40+
}
41+
42+
function printFibonacciIterative(nthElement: number) {
43+
console.log("Fibonacci Iterative", nthElement+':', fibonacciIterative(nthElement));
44+
}
45+
46+
function printFibonacciRecursive(nthElement: number) {
47+
if(!validateFibonacciInput(nthElement)) {
48+
console.log("Input", nthElement, "is invalid -_-'");
49+
return;
50+
}
51+
console.log("Fibonacci Recursive", nthElement+':', fibonacciRecursive(nthElement));
52+
}
53+
54+
//---------------------------------------------------------------------
55+
// ---------- MAIN PROGRAM ----------
56+
//---------------------------------------------------------------------
57+
if (import.meta.main) {
58+
59+
console.log('------------ Iterative ------------');
60+
printFibonacciIterative(0);
61+
printFibonacciIterative(1);
62+
printFibonacciIterative(2);
63+
printFibonacciIterative(3);
64+
printFibonacciIterative(4);
65+
printFibonacciIterative(5);
66+
printFibonacciIterative(6);
67+
printFibonacciIterative(9);
68+
printFibonacciIterative(42);
69+
printFibonacciIterative(50);
70+
printFibonacciIterative(100);
71+
console.log('\n------------ Recursive ------------');
72+
printFibonacciRecursive(-1);
73+
printFibonacciRecursive(0);
74+
printFibonacciRecursive(1);
75+
printFibonacciRecursive(2);
76+
printFibonacciRecursive(3);
77+
printFibonacciRecursive(4);
78+
printFibonacciRecursive(5);
79+
printFibonacciRecursive(7);
80+
printFibonacciRecursive(8);
81+
printFibonacciRecursive(42); // Notice how much longer this takes than the iterative version
82+
83+
// RUN: deno run Algorithms/Recursion/Fibonacci.ts
84+
}
85+
86+
// --------------------------- Terminal Output: ---------------------------
87+
// ------------ Iterative ------------
88+
// Fibonacci Iterative 0: undefined
89+
// Fibonacci Iterative 1: 0
90+
// Fibonacci Iterative 2: 1
91+
// Fibonacci Iterative 3: 1
92+
// Fibonacci Iterative 4: 2
93+
// Fibonacci Iterative 5: 3
94+
// Fibonacci Iterative 6: 5
95+
// Fibonacci Iterative 9: 21
96+
97+
// ------------ Recursive ------------
98+
// Input -1 is invalid -_-'
99+
// Input 0 is invalid -_-'
100+
// Fibonacci Recursive 1: 0
101+
// Fibonacci Recursive 2: 1
102+
// Fibonacci Recursive 3: 1
103+
// Fibonacci Recursive 4: 2
104+
// Fibonacci Recursive 5: 3
105+
// Fibonacci Recursive 7: 8
106+
// Fibonacci Recursive 8: 13

Playground/Challenges/Recursion/ReverseString.ts

Whitespace-only changes.
File renamed without changes.
File renamed without changes.

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@
1717
- [X] Graphs
1818

1919
### Algorithms
20-
- [ ] Recursion
20+
- [X] Recursion
2121
- [ ] Dynamic Programming
2222
- [ ] Comparison Sorting
2323
- [ ] *Merge Sort*

0 commit comments

Comments
 (0)