Necesito convertir esta función usando el paradigma de programación funcional, pero no sé cómo, puedo usar reducer o map creando una matriz, pero no sé cómo implementarlo, no puedo usar el operador de división, bucle o recursividad ;
function divide(dividend, divisor) { var result = 0; while (dividend >= divisor) { dividend -= divisor; result++; } return result; } console.log(divide(100, 2));
La forma de hacerlo declarativamente es con una función recursiva....
const divide = (t, b, depth = 0) => t < b ? depth : divide(tb, b, depth+1); console.log(`150 / 3 = ${divide(150, 3)}`); console.log(`24 / 3 = ${divide(24, 3)}`); console.log(`4 / 3 = ${divide(4, 3)}`);
Estoy un poco desconcertado por los requisitos. Tengo entendido que los bucles o la recursividad no están prohibidos en la programación funcional. Asumiendo que esto es un ejercicio (tiene que serlo), aquí hay otra forma de verlo:
Para resolver a / b
puedes contar cuántos b
caben en a
. Así por ejemplo:
10 / 2 -> [2, 2, 2, 2, 2] -> 5
o:
+2 +2 +2 +2 (map) 10 / 2 -> [2, 4, 6, 8, 10] -> 5 ^ ^^ (x) (pred)
Entonces podemos desplegar el divisor en una lista de sumas de sí mismo:
const unfold = (pred, map, x) => { const ys = []; for (let y = x; pred(y); y = map(y)) ys.push(y); return ys; } unfold(x => x <= 10, x => x + 2, 2); //=> [2, 4, 6, 8, 10]
Ahora podemos implementar divide
con unfold
y devolver la longitud de la lista:
const divide = (a, b) => unfold(x => x <= a, x => x + b, b) .length; divide(10, 2); //=> 5
Mi solución final es esta:
const adition = (a, b) => a + b; const subtraction = (a, b) => a - b; const multiplication = (a, b) => { return b >= 0 ? [...Array(b)].reduce((acc) => adition(acc, a), 0) : [...Array(a)].reduce((acc) => adition(acc, b), 0); }; const division = (a, b) => { return a === 0 || b === 0 ? 'Error' : b > 1 ? [...Array(a).keys()].reduce((acc, num) => multiplication(num, b) <= a ? adition(acc, 1) : acc, -1) : a; };