发布于 2026-01-06 0 阅读
0

递归入门

递归入门

作为一名编程新手,递归的概念曾让我百思不得其解。它似乎只在编程领域才会用到,而且它的优势也并不显而易见,因此很难理解。本文旨在有效地向那些不确定递归是什么、如何运作以及为什么它有用的人解释递归。

什么是递归?
根据韦氏词典的定义,递归是:

“一种计算机编程技术,涉及使用一个过程、子程序、函数或算法,该过程、子程序、函数或算法会调用自身一次或多次,直到满足特定条件为止,此时会从最后一次调用开始,依次处理每次重复的剩余部分。”

但这到底是什么意思呢?我们已经知道这是一种计算机编程技巧,但在什么情况下你会希望一个函数调用自身呢?

简而言之,递归是指函数不断调用自身,直到完成所有需要执行的操作。这有点像循环(有些语言实际上在底层就使用了递归来实现循环),但关键区别在于循环(迭代)是通过显式指定重复结构来实现的,而递归则是通过连续的方法调用来实现重复。考虑以下任务:

创建一个方法,该方法接受任意两个数字作为参数,并对它们运行斐波那契数列算法 100 次,并显示每一步的输出。

你可以像这样迭代地进行操作:

const fib = (a, b) => {   // Create the method
  counter = 0              // Instantiate a counter
  while(counter < 100) {     // Loop until the counter reaches 99 
    sum = a + b
    console.log(sum)
    a = b                  // Reassign the variables for the next iteration
    b = sum
    counter++
  }
}

fib(4,5);                   // Call the function
Enter fullscreen mode Exit fullscreen mode

这样就能得到想要的结果,而且运行良好。但是,递归地来说,它看起来会像这样:

fib = (a, b, counter = 0) => { // Create the method
  if (counter > 100) return // Check exit condition
  counter++
  console.log(a + b)
  return fib(b, a + b, counter) // Call itself again if exit condition isnt met
}

fib(4,5)
Enter fullscreen mode Exit fullscreen mode

如您所见,两者结果相同,但递归代码略短且更易读。递归能够有效处理指数级增长的问题。虽然递归在很多情况下都很有用,但也有一些情况下迭代求解更为合适。递归通常占用更多内存,因此对于需要极少内存的问题,它可能并非最佳选择。

文章来源:https://dev.to/alexdovzhanyn/recursion-for-beginners-1k7f