返回

从 函数柯里化 到 递归 ,你学废了嘛?

前端

函数柯里化

函数柯里化是将一个函数转换成另一个函数的过程,新函数接受较少的参数,并且返回一个新的函数,该函数接受剩余的参数。例如,我们可以将一个接受两个参数的函数柯里化成一个接受一个参数的函数,然后将另一个参数传递给新函数。

function add(a, b) {
  return a + b;
}

const addOne = curry(add);

addOne(1)(2); // 3

在上面的示例中,我们将 add 函数柯里化成了 addOne 函数,addOne 函数接受一个参数,并且返回一个新的函数,该函数接受另一个参数。然后,我们将 1 传递给 addOne 函数,并得到一个新的函数,该函数接受第二个参数。最后,我们将 2 传递给新函数,得到结果 3。

递归

递归是一种函数通过名称调用自己的过程。这听起来可能有点奇怪,但实际上它非常有用。例如,我们可以使用递归来实现一个阶乘函数。

function factorial(n) {
  if (n === 0) {
    return 1;
  } else {
    return n * factorial(n - 1);
  }
}

factorial(5); // 120

在上面的示例中,factorial 函数通过调用自身来计算阶乘。如果 n 等于 0,则函数返回 1。否则,函数将 n 乘以 factorial(n - 1) 的结果。

递归和柯里化的应用

递归和柯里化都是非常强大的工具,可以帮助我们编写更简洁、更强大的代码。例如,我们可以使用递归来实现一个二叉树的搜索算法。

function searchBinaryTree(root, value) {
  if (root === null) {
    return false;
  } else if (root.value === value) {
    return true;
  } else if (value < root.value) {
    return searchBinaryTree(root.left, value);
  } else {
    return searchBinaryTree(root.right, value);
  }
}

在上面的示例中,searchBinaryTree 函数使用递归来搜索二叉树中的一个值。函数首先检查根节点是否为 null。如果是,则函数返回 false。否则,函数检查根节点的值是否等于给定值。如果是,则函数返回 true。否则,函数检查给定值是否小于根节点的值。如果是,则函数在左子树中搜索给定值。否则,函数在右子树中搜索给定值。

我们还可以使用柯里化来实现一个通用的映射函数。

function map(fn, array) {
  return function(array) {
    return array.map(fn);
  };
}

const double = map(function(x) {
  return x * 2;
});

double([1, 2, 3]); // [2, 4, 6]

在上面的示例中,map 函数柯里化成了一个接受一个函数和一个数组的函数。然后,我们将 double 函数传递给 map 函数,并得到一个新的函数,该函数接受一个数组并返回一个新数组,新数组中的每个元素都是通过将 double 函数应用于原始数组中的相应元素而得到的。

总结

函数柯里化和递归都是 JavaScript 中非常强大的工具。掌握它们可以帮助我们编写更简洁、更强大的代码。虽然它们乍一看可能有点复杂,但一旦你理解了它们的工作原理,你就会发现它们非常有用。