任何编程语言中的递归都意味着一个调用自身的函数。它用于通过将大型复杂问题分解为更小的子问题来解决它们。 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。最后,我们返回所需函数的值。