Swift 递归

在本教程中,我们将学习 Swift 中的递归函数及其使用实例。

调用自身的函数称为递归函数。这种技术称为递归。

物理世界的一个例子是放置两个平行的镜子,它们面对面。它们之间的任何对象都将被递归反映。


Swift 中递归的工作

  1. func recurse() {
  2. ... ...
  3. recurse()
  4. ... ...
  5. }
  6. recurse()

这里,recurse() 函数正在反复调用自己。下图显示了递归的工作原理。


递归的停止条件

如果我们没有提到任何打破递归调用的条件,函数将继续无限地调用自身。

我们使用 if…else 语句(或类似的方法)来中断递归。

通常,递归函数有两个分支:

  • 一个用于递归调用。
  • 另一种是在某些情况下中断调用。

例如,

  1. func recurse() {
  2. if(condition) {
  3. // break recursive call
  4. recurse()
  5. }
  6. else {
  7. // recursive call
  8. recurse()
  9. }
  10. }
  11. // function call
  12. recurse()

实例 1:函数递归
  1. // program to count down number to 0
  2. func countDown(number: Int) {
  3. // display the number
  4. print(number)
  5. // condition to break recursion
  6. if number == 0 {
  7. print("Countdown Stops")
  8. }
  9. // condition for recursion call
  10. else {
  11. // decrease the number value
  12. countDown(number: number - 1)
  13. }
  14. }
  15. print("Countdown:")
  16. countDown(number:3)

结果如下:

  1. Countdown:
  2. 3
  3. 2
  4. 1
  5. 0
  6. Countdown Stops

在上面的实例中,我们创建了一个名为 countDown() 的递归函数。在这里,函数调用自身,直到传递给它的数字变为 0

number 等于 0 时,if 条件将中断递归调用。

  1. if number == 0 {
  2. print(Countdown Stops)
  3. }

程序的工作

迭代函数调用打印number == 0 ?
1countDown(3)3false
2countDown(2)2false
3countDown(1)1false
4countDown(0)0true(function call stops)

实例 2:求一个数的阶乘
  1. func factorial(num: Int) -> Int {
  2. // condition to break recursion
  3. if num == 0 {
  4. return 1
  5. }
  6. // condition for recursive call
  7. else {
  8. return num * factorial(num: num - 1)
  9. }
  10. }
  11. var number = 3
  12. // function call
  13. var result = factorial(num: number)
  14. print("The factorial of 3 is", result)

结果为:

  1. The factorial of 3 is 6

在上面的例子中,我们有一个名为 factorial() 的递归函数。注意语句,

  1. return num * factorial(num: num - 1)

这里,我们通过减少 num 参数的值来递归调用 factorial()

最初,factorial()num 的值为 3

在下一个递归调用中,num 变为 2

类似地,该过程将一直持续到 num 变为 0

num 等于 0 时,if 条件将中断递归调用。


程序工作流程图


函数递归的优缺点

下面是在 Swift 编程中使用递归的优点和缺点。

1.优势
  • 它使我们的代码更短、更清晰。
  • 在涉及数据结构和高级算法(如图和树遍历)的问题中,需要递归。
2.缺点
  • 与迭代程序相比,它占用了大量堆栈空间。
  • 它需要更多的处理器时间。
  • 与等效的迭代程序相比,它可能更难调试。

分类导航