引入:斐波拉契的递归代码
int fun(int n)
{
if(n<=2)
{
return 1;
}
else
{
return fun(n-2)+fun(n-1);
}
}
什么时候使用递归?
1.an和a(n-1)存在关系时。
2.事件可以分解成类似的事件。
递归的优势
代码简单。
递归的问题
可能导致栈溢出(stack overflow)。
(每次递归相当于在原函数未结束时再次调用函数,调用函数会申请栈区空间,栈区申请过多栈空间消耗,导致溢出。)
如何避免栈溢出?
static修饰变量或全局变量
用stasic,变为静态变量,缓解栈区压力。
全局变量,不占用栈区空间,同时不用传参。
斐波拉契递归代码优化
思路:避免重复求值。
int arr[100] = { 0 };//建立数组保留数字记录
int fun(int n)
{
if (arr[n] != 0)
{
return arr[n];//有无计算过
}
else {
if (n <= 2)
{
arr[n] = 1;
return arr[n];
}
else
{
arr[n] = fun(n - 2) + fun(n - 1);
return arr[n];
}
}
}
递归能实现倒序输出: