我一直在努力为这个函数找到一个紧密的约束时间复杂度,仅针对其中一个参数。我以为是O(p ^ 2)(或者说是相当大的theta),但我不确定了。
(define (acc p n)
(define (iter p n result)
(if (< p 1)
result
(iter (/ p 2) (- n 1) (+ result n))))
(iter p n 1))
答案 0 :(得分:2)
n
的值不敏感。
您正在汇总一系列数字,从n
开始倒计时。 iter
将迭代的次数取决于p
在不小于1的情况下减半的次数。换句话说,p
中最左边的'1'位的位置,减一,是iter
将迭代的次数。这意味着iter
的投放次数与log p
成正比。
答案 1 :(得分:0)
您可能会尝试对其进行观察,或者更系统地从中进行观察。假设我们从头开始这样做,我们应该尝试从函数定义构建一个递归关系。
目前,我们可以假设一个非常简单的机器模型,其中算术运算和变量查找是恒定时间。
让iter-cost
成为计算iter
计算所需步数的函数的名称,并将其作为p
的函数,因为iter
'终止仅取决于p
。然后你应该能够为iter-cost(0)
编写表达式。您能为iter-cost(1)
,iter-cost(2)
,iter-cost(3)
和iter-cost(4)
执行此操作吗?
更一般地说,如果p
大于零,您能表达iter-cost(p)
吗?这将是常量和对iter-cost
的重复调用。如果你可以表现为复发,那么你可以更好地以封闭的形式表达它。