📜  Dart – 递归

📅  最后修改于: 2021-09-02 05:49:41             🧑  作者: Mango

任何编程语言中的递归都意味着一个调用自身的函数。它用于通过将大型复杂问题分解为更小的子问题来解决它们。 Dart也同样实现了递归。

在递归函数,函数重复调用自身,直到达到基本条件。该函数基本上有两个部分。

  • 递归:递归部分用较小的子问题一次又一次地调用。
  • Base:每次进行函数调用时都会检查基础条件。如果函数处于基本条件,则用于提供解决方案。

递归使用堆栈来存储子问题的值/结果,以便稍后返回给主问题。

如需深入了解递归,请访问:https://www.geeksforgeeks.org/recursion/

句法:

void gfgRec()
{
    // Base code....

    gfgRec();

    // Some code...
}


void main()
{
    gfgRec();
}

例子:

我们将使用第 n 个斐波那契数的程序来演示dart的递归 –

Dart
int Fib(int n){
  if(n<=1) //Base Condition
    return n;
  return Fib(n-1)+Fib(n-2);
}
  
  
void main() {
  print(Fib(6));
}


Dart
int Fact(int n){
  if(n<=1) //Base Condition
    return 1;
  return n*Fact(n-1);
}
  
  
void main() {
  print(Fact(8));
}


输出:

8

解释:

从图中我们可以看到,对以n=6为参数的函数的调用,依次以较小的值5和4调用自己。他们自己调用较小值的函数,直到达到基本条件。当满足基本条件时,函数开始返回值。所以最终结果是 8,它是对 5 和 4 的调用之和。

在递归的情况下,每次新函数调用时问题都需要变小,因为问题必须终止才能返回结果。这种条件在递归中称为终止条件。如果问题没有终止,它可能会导致无限循环,正如我们所看到的,这些函数调用使用堆栈内存来存储临时值,它们可能会使用大量内存。如果基本条件未定义或无法达到,则该函数可能会导致堆栈溢出。

使用递归的一些优点和缺点

使用递归的优点:

  • 使用递归的问题解决方案非常简洁和简短。
  • 它们很容易用于与树和图相关的问题。
  • 降低问题的时间复杂度。
  • 减少不必要的函数调用。

使用递归的缺点:

  • 该问题占用了大量空间。
  • 逻辑可能很难理解。
  • 当卡住时很难调试。

现在我们将使用另一个例子来更好地理解它在dart中的实现。

例子:

我们将编写一个程序来使用递归查找数字的阶乘。

Dart

int Fact(int n){
  if(n<=1) //Base Condition
    return 1;
  return n*Fact(n-1);
}
  
  
void main() {
  print(Fact(8));
}

输出:

40320

解释:

从图中,我们可以推断出这样一个事实函数调用自身直到达到基本条件,即我们用的值“N”与值的函数的值相乘,直到n的值返回的函数“N-1”变为等于 1。最后,我们返回所需函数的值。