什么是尾递归,举个例子详细描述一下
时间: 2023-07-03 16:17:09 浏览: 175
尾递归是指一个递归函数中,递归调用是该函数中的最后一步操作。这种递归形式可以被优化,避免栈溢出,提高程序效率。在一些编程语言(如Scheme)中,编译器会自动对尾递归进行优化,将其转化为循环实现。
举个例子,假设我们要计算斐波那契数列的第 n 个数:
```
int fibonacci(int n) {
if (n == 0 || n == 1) {
return n;
} else {
return fibonacci(n-1) + fibonacci(n-2);
}
}
```
在这个实现中,递归调用出现在 return 语句中,因此不是尾递归。当 n 较大时,递归深度会很大,容易导致栈溢出。
我们可以将其改为尾递归形式,如下所示:
```
int fibonacci_tail(int n, int a, int b) {
if (n == 0) {
return a;
} else {
return fibonacci_tail(n-1, b, a+b);
}
}
int fibonacci(int n) {
return fibonacci_tail(n, 0, 1);
}
```
在这个实现中,定义了一个辅助函数 `fibonacci_tail`,其中参数 a 和 b 分别表示斐波那契数列中的前两个数。递归调用出现在 return 语句中,且是该函数的最后一步操作,因此是尾递归。这样递归深度就不会很大,也不容易导致栈溢出。
阅读全文