// 1. identify the base case that is the case that stops the recursion
// 2. identify the recursive case that is the case that makes the function recursive
// 3. get closer and closer and return when needed, usually 2 returns
void main() {
int counter = 0;
inception(){
print(counter);
if(counter > 4){
return print('donr') ;
}
counter++;
return inception();
}
// write two functions that returns factorial of any number, one for recursion and the other for loop
dynamic findFactorialRecursive(number){
// n! = n*n-1!
if(number<2){
return 1 ;
}
// print('${number*findFactorialRecursive(number-1)}');
return number*findFactorialRecursive(number-1);
}
findFactorialIterative(number) {
int answer = 1;
// you actually no longer need the if statement because of the for loop
// if (number === 2) {
// answer = 2;
// }
for (var i = 2; i <= number; i++) {
answer *= i;
}
return print(answer);
}
fibonacciRecursive(number) { // 0(2^n) time complexity
if(number< 2 ){
return number;
}
return fibonacciRecursive(number -1) + fibonacciRecursive(number -2) ;
}
fibonacciIterative(number) { //0(n)
List arr = [0,1];
for(var i = 2; i < number+1; i++){
arr.add(arr[i-2] +arr[i -1]);
}
return arr[number];
}
reverseString(str) {
}
reverseStringRecursive(str) {
List arr = [];
if(str.length == 0|| str.length < 2) return str;
return str[str.length-1] + reverseStringRecursive(str.substring(0, str.length - 1)) ;
}
;
print( reverseStringRecursive("yoyo master"));
// inception();
}