如何在没有运算符、循环或递归的情况下实现除法函数?

How to implement a division function without the operator, loop or recursion?

我需要使用函数式编程范式转换这个函数,但我不知道如何,我可以使用 reducer 或 map 创建数组,但我不知道如何实现它,我不能使用 divide运算符、循环或递归;

function divide(dividend, divisor) {
  var result = 0;
  while (dividend >= divisor) {
    dividend -= divisor;
    result++;
  }
  return result;
}

console.log(divide(100, 2));

声明式的方法是使用递归函数....

const divide = (t, b, depth = 0) => t < b ? depth : divide(t-b, b, depth+1);

console.log(`150 / 3 = ${divide(150, 3)}`);
console.log(`24 / 3 = ${divide(24, 3)}`);
console.log(`4 / 3 = ${divide(4, 3)}`);

我对这些要求有点不解。我的理解是在函数式编程中不禁止循环或递归。假设这是一个练习(它必须是),那么这里是另一种看待它的方式:

要解决 a / b 你可以数一数 a 你能装多少 b。例如:

10 / 2 -> [2, 2, 2, 2, 2] -> 5

或:

            +2 +2 +2 +2 (map)
10 / 2 -> [2, 4, 6, 8, 10] -> 5
           ^           ^^
          (x)         (pred)

所以我们可以将除数展开成一个和列表:

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]

现在我们可以用 unfold 和 return 实现 divide 列表的长度:

const divide = (a, b) =>
  unfold(x => x <= a, x => x + b, b)
    .length;

divide(10, 2);
//=> 5

我的最终解决方案是这样的:

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;
};