【译】一分钟了解递归

1,333 阅读3分钟

翻译:Da
原文地址:dev.to/glitter45/r…

很多人在不知不觉中使用了递归却不清楚啥是递归,下面的文章用通俗的语言解释了什么是递归,以及如何使用它。

什么是递归

用通俗的语言解释就是:当我们需要重复执行相同的任务时,我们可以称其为递归任务。再用编程术语解释就是:当函数调用函数本身来执行任务,并且会重复执行时,我们称之为递归。

还没听懂?

好吧,我们来个栗子:

function findCorrectObject(arr, id) {
   if(arr[arr.length].id === id) {
     return arr[arr.legth];
   } else if(arr.length === 0) {
     return "Not found!";
   } else {
     arr.pop();
     findCorrectObject(arr, id);
   }
}
findCorrectObject([{id: "3434343", title: "title 1"}, {id: "45454565", title: "title 2"}], "3434343");

在这个例子中,我们要从数组中找到id为"3434343"的元素,如上,我们用所需的参数调用了相同的函数findCorrectObject,这就是递归,它会一直执行直到找到对应的对象,或者数组变空返回"not found"。

很简单吧!

在什么场景下需要使用递归呢

在js中,递归大有用处,在很多情景中我们都可以使用递归哦。比如:JSON.parse/JSON.stringify

如果你看过lodash里_deep()的源码,它就用到了递归。大家都知道,_deep()是用来深拷贝的,在js中,我们如果简单的将对象赋值给一个新变量,只是将对象的指针赋值给了变量,如果我们在新变量中修改了对象,那么已存在的变量也会改变,这就是浅拷贝。而递归就可以解决这一问题,实现深拷贝。(大家有兴趣的可以去loadsh中看源码,这里就不多做解释了,毕竟是一分钟了解递归嘛)

再举个栗子

下面我再举个非常著名的栗子来跟大家解释递归:

function calculateFactorial(num) {
  if(num === 1) return 1;
  return num * calculateFactorial(num - 1);
}

calculateFactorial(5);

在这个函数中,calculateFactorial会被执行5次。每当calculateFactorial(num - 1)被执行时,它都会创建单独的函数堆栈,并且上一个函数会等待,直到当前函数解析完成。重复以上,新函数会继续被调用,直到返回 1;

在最近我的项目开发过程中,就用到了递归(我使用的是React)。当时是我们遇到一个问题:用户需要在下拉框中为家长选择他们的孩子,但是他们的孩子,也可能有自己的孩子,这样数据就会增长。我在里面使用了大量的递归,因为每个对象都可能会有另一组对象,我需要不停深入,直到没有对象中没有小孩的数据。像这样的情况,就可以使用递归解决啦。

递归可以解决很多循环无法解决的问题,而且用递归实现,代码会更整洁易读哦!

感谢阅读!欢迎评论交流!