javascript js函数通过乘法器数组重复调用

j13ufse2  于 2023-06-20  发布在  Java
关注(0)|答案(5)|浏览(124)

我遇到了一个错误:Uncaught TypeError TypeError: multipliers.reduce(...) is not a function。我在看咖喱和部分应用程序。我期望multiply函数通过乘法器数组正确调用。有人能解释一下我的multiply函数中缺少了什么吗?
multiply函数,将整数相乘,但以特殊的方式。函数的输出可以被反复调用,直到您不带参数地调用它为止。例如,multiply(3)(4)(5)()应该返回3 * 4 * 5 = 60。我使用了一个辅助函数solution(multipliers),它获取所有乘数,然后将它们传递给multiply,如上所述。
输入

multipliers: [3, 4, 5]

输出量

60

代码

function multiply(x) {
    return function(y) { // anonymous function
        return function(z) { // anonymous function
            return x * y * z;
        }
    }
}

// this function lets you invoke something like multiply(3)(4)(5)() with dynamic arguments
function solution(multipliers) {
    return (multipliers.reduce((prev, arg) => {
        if (prev) {
            return prev(arg);
        }
        return multiply(arg);
    }, null))();
}

console.log(solution([3, 4, 5]));
icomxhvb

icomxhvb1#

在调用数组方法之前,必须将所有参数都压入数组。或者你可以使用函数内部的arguments参数来获取所有的参数。
你能分享一下这个函数是如何被调用的吗?

6kkfgxo0

6kkfgxo02#

使用multiply函数作为reduce调用的初始值,并删除最后的()

function solution(multipliers) {
    return multipliers.reduce((prev, arg) => prev(arg), multiply);
}
console.log(solution([3, 4, 5]));

function multiply(x) {
    return function(y) {
        return function(z) {
            return x * y + z;
        }
    }
}
bejyjqdl

bejyjqdl3#

multiply函数定义不正确。如果你想让multiply(3)(4)(5)()计算为60,那么你需要定义multiply函数如下。

// x is required, y is optional, both are numbers
const getMultiply = (x) => (y) =>
  typeof y === "undefined" ? x : getMultiply(x * y);

// 1 is the identity element of multiplication
const multiply = getMultiply(1);

console.log(multiply(3)(4)(5)()); // 60

正确定义multiply后,可以按如下方式定义solution

// x is required, y is optional, both are numbers
const getMultiply = (x) => (y) =>
  typeof y === "undefined" ? x : getMultiply(x * y);

// 1 is the identity element of multiplication
const multiply = getMultiply(1);

const solution = (multipliers) =>
  multipliers.reduce((f, x) => f(x), multiply)();

console.log(solution([3, 4, 5])); // 60
vxbzzdmp

vxbzzdmp4#

您正在以IIFE的身份调用对multipliers.reduce(...)的调用。这是行不通的,因为在代码中调用reduce的结果不是一个函数,而是一个数字。
在你提供的代码中,你基本上写了:

function solution(multipliers) {
  return (60)(); // 60 here being the result of calling the reduce
}

这就解释了你收到的错误。
您所需要做的就是省略IIFE调用。您的函数变为:

function solution(multipliers) {
    return multipliers.reduce((prev, arg) => {
        if (prev) {
            return prev(arg);
        }
        return multiply(arg);
    }, null);
}

最后,我建议在这里或this question中查看一些其他答案,以更好地实现multiply函数,使其更通用。

j9per5c4

j9per5c45#

我只能使用currying修改multiply函数,这要感谢@ghassen-louhaichi提供的一个相关问题的链接:Create a function with an undetermined number of successive calls

function multiply(x) {
    return function() {
        if (arguments.length == 0) {
            return x;
        } else {
            return multiply(x * arguments[0]);
        }
    }
}

// this function lets you invoke something like multiply(3)(4)(5)() with dynamic arguments
function solution(multipliers) {
    return (multipliers.reduce((prev, arg) => {
        if (prev) {
            return prev(arg);
        }
        return multiply(arg);
    }, null))();
}

console.log(solution([3, 4, 5]));

第一次调用multiply,返回内部函数。根据传递给内部函数的参数数量,它返回multiply参数的值,或者它再次调用“multiply”与更新的运行总数(从而再次返回要再次调用的内部函数)。
这个实现的局限性是你必须进行一个没有参数的最终调用才能得到最终值。

相关问题