这两个因子函数都在O(n)中运行吗?

时间:2010-09-26 10:21:29

标签: php algorithm big-o

递归函数定义如下:

function factrec($x) {
    if($x <= 1) {
        return $x;
    } else {
        return $x * factrec($x - 1);
    }
}

在这里迭代:

function factiter($x) {
    $y = $x;
    while($y > 1) {
        $x *= ($y - 1);
        $y--;
    }
    return $x;
}

我已经读过,在递归函数中,正文是O(1),递归调用O(n-1)使其成为O(n),但对于迭代,它是否也是O(n)?

2 个答案:

答案 0 :(得分:8)

是的,两个版本都在O(n)时间内运行。迭代版本的推理与递归版本的推理基本相同:循环体在O(1)时间内运行并执行n次。

但是应该注意,迭代版本在O(1)空间中运行,而递归版本使用O(n)堆栈空间(因为递归深度为n)。

答案 1 :(得分:0)

是的,是O(n)。试着想象当你有一个很大的x值时,处理器将运行多少个操作。对于较大的值,它不会变得更复杂,并且它以线性方式始终是相同的操作。