复杂度分析
迭代与递归
- 函数返回前上下文存储在栈帧空间,故递归比迭代耗费更多内存空间
- 递归调用函数有额外开销,故递归时间效率也更低
迭代
尾递归和正常递归
- 尾递归会被编译器优化,空间效率相当于迭代!!!原因是尾递归无需保存上下文,正常递归需保存上一层递归的上下文
/* 普通递归 */
int Recursion(int i)
{if (i == 1) return 1;int res = Recursion(i - 1);return i + res;
}/* 尾递归,将存储结果的变量res置为参数 */
int tailRecur(int i, int res)
{if (i == 0) return res;return tailRecur(n - 1, res + n);
}
int func()
{int res = 0;return tailRecur(5, res); //计算1--5的和,存储在res中
}
- 尾递归本质就是直接return func() 好处是递的时候计算,归的时候一路返回某个确定的数
递归树
// 斐波那契问题:数列前n项和:0 1 1 2 3 5 8
int fibo(int i)
{if (i == 1) return 0;if (i == 2) return 1;return fibo(i-1) + fibo(i-2);
}