递归乘法功能

时间:2019-10-05 18:18:07

标签: javascript

我正在尝试执行一个赋值操作,要求它产生一个将正整数乘以123而不使用循环或*或除运算符的函数。

function multiply(x, y){
    if (y === 0) return 0;
    return x + multiply(x, y - 1);
}

我有一个可以将2个数字相乘的函数,但是我该如何将其乘以一个固定的数字呢?

4 个答案:

答案 0 :(得分:2)

function multiply_123(x) {
     return multiply(x, 123);
}

或更好一点

function multiply_123(x) {
     if(x==0) {
         return 0;
     } else {
         if(x > 123) {
             return multiply(x, 123);
     } else {
         return multiply(123, x);
     }
}

答案 1 :(得分:1)

如果另一个值是奇数,则可以将其相加,然后将第一个值的两倍和另一个值的一半相加,最好现在加为Ancient Egyptian multiplication

function multiply(a, b) {
    if (b === 1) return a;
    return (b & 1 && a) + multiply(a << 1, b >> 1);
}

console.log(multiply(4, 5));
console.log(multiply(5, 4));

答案 2 :(得分:1)

您有一个将两个数字相乘的函数,现在您希望有一个仅接受一个参数然后“设置”另一个参数的函数。这称为partial application

这是执行此操作的基本方法-创建一个仅接受单个参数并使用该参数调用另一个函数的新函数,以及一个常量:

function multiply(x, y){
    if (y === 0) return 0;
    return x + multiply(x, y - 1);
}

function multiplyBy123(x) {
  return multiply(x, 123);
}

console.log(multiplyBy123(3));
console.log(multiplyBy123(10));

这也可以变得更通用:

function multiply(x, y){
    if (y === 0) return 0;
    return x + multiply(x, y - 1);
}

function multiplyBy(x) {
  return function (y) {
    return multiply(x, y);
  }
}

var multiplyBy123 = multiplyBy(123);

console.log(multiplyBy123(3));
console.log(multiplyBy123(10));

此技术称为currying-基本原理是您可以将具有多个参数的函数分解为需要一个参数的函数,然后返回需要其余参数的函数。因此,在这种情况下,multiplyBy接受x并返回一个期望y的函数,然后在使用参数调用该函数时,它同时使用{{1} }和multiply

部分应用功能的一种更简单通用的方法是使用Function.bind,它允许您设置一些参数。您可以设置第一个参数,然后将获得一个需要第二个参数的函数:

x

如果允许您更改y,则可以使其变得更加简单,如果未指定,则可以使用default parameter valuefunction multiply(x, y){ if (y === 0) return 0; return x + multiply(x, y - 1); } var multiplyBy123 = multiply.bind(null, 123); console.log(multiplyBy123(3)); console.log(multiplyBy123(10));设置为multiply

y

答案 3 :(得分:0)

尾递归示例:

const mult = (...args) => {
  const [ a, b, ...rest] = args
  if (args.length === 2) {
    return a * b
  }
  return mult(a * b, ...rest)
}