Cuando una función se llama a sí misma, y crea una nueva ejecución de la función, pero en algún momento debemos parar el proceso (con alguna validación o algo).

function recursiva(num) {
	conosle.log(num);

	if (num < 5) {
		return recursiva(num + 1);
	}
	else {
		return 5;
	}
}

recursiva(0);

En este caso, cuando la variable num llega a ‘4’ se vuelve e llamar a la función pasando como argumento el número 5. En esta ejecución, 5 no es menor que 5, entonces se ejecuta el bloque else y se retorna un 5 para cortar con las ejecuciónes.

function recursiva_2(numArray) {
	if (numArray.length != 0) {
		const firstNum = numArray[0];
		console.log(firstNum);
		numArray.shift();
		
		recursiva_2(numArray);
	}
}

const numbers = [3,4,3,2,5,6,4,3,5,6,8,6,5,9];
recursiva_2(numbers);

Recursividad: deep copy ( POO )

function deepCopy(subject) {
	let copySubject;
	if (Array.isArray(subject)) {
		copySubject = [];
	}
	else if (typeof subject == 'object') {
		copySubject = {};
	}
	else {
		return subject;
	}

	for(key in subject) {
		if (typeof subject[key] == 'object') {
			copySubject[key] = deepCopy(subject[key]);
		}
		else if (Array.isArray(subject[key])) {
			copySubject.push(subject[key]);
		}
		else {
			copySubject[key] = subject[key];
		}
	}

	return copySubject;
}

Recursividad: deep freeze ( POO )

function deepFreeze(obj) {
  Object.keys(obj).forEach(prop => {
    if (typeof obj[prop] === 'object') deepFreeze(obj[prop]);
  });
  return Object.freeze(obj);
}