返回

从用例解析迭代和递归思维模式,解决面试难题

前端

如今,掌握迭代和递归的思维模式是程序员的必备技能。本文通过具体用例演示如何使用迭代和递归来解决复杂问题,帮助读者深入理解它们之间的区别,强化应用能力。

我们先来看一个例子:

async function loadUrls(urls, max) {
  const results = [];
  const promises = [];

  for (const url of urls) {
    promises.push(fetch(url));
    if (promises.length >= max) {
      await Promise.all(promises);
      promises.length = 0;
    }
  }

  if (promises.length > 0) {
    await Promise.all(promises);
  }

  return results;
}

这个函数用于控制多个异步请求,通过max限制同一时刻的并发请求数,其返回Promise,结果为所有urls的异步结果。

我们再来讨论一个例子:

function isPalindrome(str) {
  if (str.length === 0) {
    return true;
  }

  if (str[0] === str[str.length - 1]) {
    return isPalindrome(str.substring(1, str.length - 1));
  }

  return false;
}

这个函数用于判断字符串是否是回文,即正反读都一样的字符串。

在第一个例子中,我们使用迭代的方式来控制异步请求的并发数。我们使用一个for循环来遍历urls,每次循环都向promises数组中添加一个fetch(url)的Promise。当promises数组的长度达到max时,我们就使用Promise.all(promises)来等待所有Promise执行完毕,然后清空promises数组。这样就可以保证同一时刻最多只有max个并发请求。

在第二个例子中,我们使用递归的方式来判断字符串是否是回文。我们首先检查字符串的长度是否为0,如果是,则返回true。否则,我们检查字符串的第一个字符和最后一个字符是否相等,如果是,则我们递归地调用isPalindrome函数来检查字符串的中间部分是否是回文。如果不是,则返回false。

希望这两个例子能够帮助你理解迭代和递归的不同之处,以及如何使用它们来解决问题。