什么是递归?
根据维基百科的定义,递归是这样描述的:
"递归通常用于描述以类似于已显示方式重复对象的过程。例如,当两面镜子相互对着时,产生的图像就是一个很好的例子。"
在 JavaScript/TypeScript 中呢?
在 JavaScript/TypeScript 中,递归是指函数或类型在满足特定条件之前重复调用自身,这可以出现在函数中,即递归函数调用,也可以出现在类型中。
示例
假设我们有一个包含文件(File)和文件夹(Folder)的数组,并且我们需要在控制台中显示每个文件(或文件夹)的名称:
首先,我们需要创建一个适用于我们递归函数的类型:
代码语言:typescript复制type Item = {
id: string
name: string
// 如果存在 children,那么这是一个文件夹(Folder),否则是文件(File)。
children?: Item[]
}
正如您所见,我们使用了递归,因为我们将 children 的类型设置为 Item[],这意味着创建了一种递归、嵌套的结构。
接下来,我们的函数会是这样的:
代码语言:typescript复制const showFileAndFolders = (items: Item[]) => {
// 遍历所有项目。
items.forEach(item => {
// 如果存在 children,则为文件夹(Folder),否则为文件(File)。
if (item.children) {
// 是文件夹,显示名称并再次调用函数以处理 `children`。
console.log('Folder: ', item.name)
// 递归调用,函数内部再次调用自身。
showFileAndFolders(item.children)
return;
} else {
// 是文件,显示名称。
console.log('File: ', item.name)
return;
}
})
}
其他示例
递归的常见应用也可见于以下情况:
斐波那契数列
代码语言:typescript复制const generateFibonacci = (num: number) => {
if (num <= 1) return n;
return generateFibonacci(num - 1) generateFibonacci(num - 2);
}
我正在参与2023腾讯技术创作特训营第三期有奖征文,组队打卡瓜分大奖!