递归 VS 迭代

很明显,用递归写出来的代码十分的简洁,然而递归却有一个致命的缺陷,那就是它的时间复杂度是N的指数级,并且会消耗大量的内存,使用不当还会导致爆栈.
比如:

int func(int n){
    if(n<=2) return n;
    int x = func(n-1) + f(n-2);
    return x;
}

如果将递归换成迭代呢?

int func(int n) {
    if (n <= 2) return n;
    int x = 1, y = 2, z = 0;
    for (int i = 3; i <= n; i++) {
        z = x + y;
        x = y;
        y = z;
    }
    return z;
}

代码明显多了,但是消耗的资源却少了,并且时间复杂度为O(N).

因此我觉得递归应该尽量用在计算量小且调用少的地方;而用在计算量大的地方,可能就会是个灾难.