簡體   English   中英

如何在沒有運算符、循環或遞歸的情況下實現除法 function?

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

我需要使用函數式編程范例轉換這個 function 但我不知道如何,我可以使用減速器或 map 創建一個數組但我不知道如何實現它,我不能使用除法運算符、循環或遞歸;

 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(tb, b, depth+1); console.log(`150 / 3 = ${divide(150, 10)}`); 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實現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;
};

下面的代碼:(lambda javascript)

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM