时间复杂度是多少?为什么呢?
(define (mult a b)
(define (internal a accum)
(if (= a 1) accum
(internal (- a 1) (+ accum b))))
(internal a b))
(define (to-the-power-of m n)
(define (internal x accum)
(if (= x 0) accum
(internal (- x 1) (mult accum m))))
(internal n 1))
答案 0 :(得分:3)
多部分的时间复杂度可以这样找到:
计算(mult a b),(内部一个accum)被调用,直到a = 1 所以我们有一种尾递归(循环)迭代a。
我们因此知道(mult a b)的时间复杂度 O(a)(=线性时间复杂度)
(对于m n的幂)也有一个(内部x accum)定义,它也循环(直到x = 0)
所以我们再次 O(x)(=线性时间复杂度)
但是:我们没有考虑内部函数调用所需的时间...
在内部,我们使用(mult a b)定义,该定义在时间复杂度上是线性的,因此我们有以下情况:
在第一次迭代中,调用mult:(mult 1 m) - > O(1)
第二次迭代变为:(mult m m) - > O(M)
第三次迭代:(multm²m) - > O(M * M)
等等
很明显,这种情况一直持续到n = 0(或者在内部,这变成x = 0)
因此我们可以说时间复杂度将取决于m和n: O(m ^ n)
[编辑:]您还可以查看我之前提到的相关问题:Big O, how do you calculate/approximate it?这可能会让您了解如何更一般地处理近似值
答案 1 :(得分:0)
假设加法和乘法都被计为单个运算,则此函数执行O(m ^ n)运算。
首先考虑mult功能。它(mult a b)将完全执行a-1次添加。因为渐近增长是相同的,所以为了数学简单,我们将其近似为a。
现在,对于power-power-of函数,这将执行对mult函数的n次调用。这些调用是(mult 1 m),yield m,然后是(mult m m),产生m ^ 2,然后是(mult m ^ 2 m),产生m ^ 3,依此类推到m ^ n。所以这里执行的操作总数是和m ^ 0 + m ^ 1 + ... + m ^ n。这是(m ^ n - 1)/(m-1),其增长为m ^ n。