TypeScript 中的递归(不仅仅是递归)


递归是一个基本的编程概念,指的是函数调用自身。它可以是解决问题的强大工具,但也可能是困惑和沮丧的根源,尤其对于初学者而言。在本教程中,我们将探讨如何在 TypeScript 中有效地使用递归,TypeScript 是 JavaScript 的一个流行超集,它添加了可选的静态类型和其他功能。

使用递归时,要记住的一件重要事情是定义一个基本情况,这是一个使函数不再调用自身的条件。如果没有基本情况,函数将无限地调用自身,导致无限循环。

在 TypeScript 中处理递归涉及理解如何在 TypeScript 程序中有效地使用递归函数。这包括定义一个基本情况以防止函数无限地调用自身,考虑递归函数的性能,并可能使用记忆化和尾调用优化等技术来提高函数的性能。它还涉及理解 TypeScript 的特定语法和功能,例如可选的静态类型和编译器标志,这些可以在递归函数中使用。

在 TypeScript 中使用递归的步骤

除了理解如何在 TypeScript 中有效地使用递归之外,在处理 TypeScript 程序中的递归时还需要考虑其他一些事项:

  • 选择合适的工具 - 递归功能强大,但可能存在更好的解决方案。考虑一下迭代(基于循环)的解决方案或其他方法是否更合适。

  • 彻底测试您的代码 - 递归函数可能难以调试,因此务必测试您的代码以确保其正常工作。

  • 了解递归的局限性 - 由于为每个函数调用创建新的堆栈帧,递归函数可能会消耗大量内存来处理大型输入。这可能会导致堆栈溢出错误。

  • 谨慎使用递归 - 虽然递归是一个有用的工具,但务必谨慎使用,并且仅在它是解决问题的最合适解决方案时才使用它。

记住这些要点,您可以有效地处理 TypeScript 程序中的递归。

示例 1

以下是如何在 TypeScript 中处理递归的示例。在这个例子中处理递归,我们首先定义停止函数无限调用自身的基本情况。在这种情况下,基本情况是当 n 为 0 或 1 时。然后,我们定义当 n 大于 1 时的递归情况,并指定函数如何计算斐波那契数列中的第 n 个数。斐波那契函数接受单个参数 n 并返回一个数字。该函数使用基本情况在 n 为 0 或 1 时分别返回 0 或 1。在递归情况下,该函数返回斐波那契数列中第 (n - 1) 个数和第 (n - 2) 个数的和。

最后,我们使用不同的输入值测试该函数以确保其正常工作。通过遵循这些步骤,我们可以有效地处理此 TypeScript 函数中递归的使用。

// function that calculates the nth number in the Fibonacci sequence
function fibonacci(n: number): number {
   // the base case: when n is 0 or 1, return n
   if (n === 0 || n === 1) {
      return n
   }
   // In the recursive case, calculate the nth number by adding the
   // (n - 1)th and (n - 2)th numbers in the sequence
   return fibonacci(n - 1) + fibonacci(n - 2)
}

// Examine the function using various input values
console.log('Fibonacci of 0th term: ', fibonacci(0)) // 0
console.log('Fibonacci of 1st term: ', fibonacci(1)) // 1
console.log('Fibonacci of 5th term: ', fibonacci(5)) // 5
console.log('Fibonacci of 10th term: ', fibonacci(10)) // 55

编译后,它将生成以下 JavaScript 代码:

// function that calculates the nth number in the Fibonacci sequence
function fibonacci(n) {

   // the base case: when n is 0 or 1, return n
   if (n === 0 || n === 1) {
      return n;
   }
   
   // In the recursive case, calculate the nth number by adding the
   
   // (n - 1)th and (n - 2)th numbers in the sequence
   return fibonacci(n - 1) + fibonacci(n - 2);
}

// Examine the function using various input values
console.log('Fibonacci of 0th term: ', fibonacci(0)); // 0
console.log('Fibonacci of 1st term: ', fibonacci(1)); // 1
console.log('Fibonacci of 5th term: ', fibonacci(5)); // 5
console.log('Fibonacci of 10th term: ', fibonacci(10)); // 55

输出

以上代码将产生以下输出:

Fibonacci of 0th term:  0
Fibonacci of 1st term:  1
Fibonacci of 5th term:  5
Fibonacci of 10th term:  55

示例 2

在这个例子中处理递归,我们首先定义停止函数无限调用自身的基本情况。在这种情况下,基本情况是当数组为空时。然后,我们描述数组不为空时的递归情况,并指定函数如何计算数组元素的总和。sum 函数接受一个数字数组并返回一个数字。该函数使用基本情况在数组为空时返回 0。在递归情况下,该函数返回数组中的第一个元素加上其余元素的总和。

最后,我们使用不同的输入值测试该函数以确保其正常工作。通过遵循这些步骤,我们可以有效地处理此 TypeScript 函数中递归的使用。

// function that calculates the sum of all numbers in an array
function sum(arr: number[]): number {

   // the base case: when the array is empty, return 0
   if (arr.length === 0) {
      return 0
   }
   
   // In the recursive case, return the first element in the array plus the sum
   
   // of the remaining elements
   return arr[0] + sum(arr.slice(1))
}

// Test the function with different input values
console.log('Sum of array [1, 2, 3, 4, 5]: ', sum([1, 2, 3, 4, 5])) // 15
console.log('Sum of array [-1, 2, -3, 4, -5]: ', sum([-1, 2, -3, 4, -5])) // -3
console.log('Sum of array []: ', sum([])) // 0

编译后,它将生成以下 JavaScript 代码:

// function that calculates the sum of all numbers in an array
function sum(arr) {

   // the base case: when the array is empty, return 0
   if (arr.length === 0) {
      return 0;
   }
   
   // In the recursive case, return the first element in the array plus the sum
   
   // of the remaining elements
   return arr[0] + sum(arr.slice(1));
}

// Test the function with different input values
console.log('Sum of array [1, 2, 3, 4, 5]: ', sum([1, 2, 3, 4, 5])); // 15
console.log('Sum of array [-1, 2, -3, 4, -5]: ', sum([-1, 2, -3, 4, -5])); // -3
console.log('Sum of array []: ', sum([])); // 0

输出

以上代码将产生以下输出:

Sum of array [1, 2, 3, 4, 5]:  15
Sum of array [-1, 2, -3, 4, -5]:  -3
Sum of array []:  0

更新于:2023年1月20日

4K+ 次浏览

启动您的职业生涯

完成课程获得认证

开始
广告