如何分析这个伪代码

时间:2011-05-18 04:22:27

标签: math

我有以下伪代码:

sum<-0
inc<-0
for i from 1-n
  for j from 1 to i
     sum<-sum+inc
     inc<-inc+1

我被要求找到一个封闭的公式。提示是使用常见的总结。无论我怎么看,我都不能用求和形式编写这段代码。有人能让我知道总结会是什么样子,甚至是递归公式吗?

2 个答案:

答案 0 :(得分:1)

假设for i from 1-n表示:

for i from 1 to n

通过一些数值分析可以得到一个封闭的公式。让我们检查一下n(5和6)值的循环次数。

外部循环总是n次,内部循环是每次迭代的i,所以对于n的值,这里是迭代次数:

n    count
=    ===========================================
1    (1)                                    =  1
2    (1),(12)                               =  3
3    (1),(12),(123)                         =  6
4    (1),(12),(123),(1234)                  = 10
5    (1),(12),(123),(1234),(12345)          = 15
6    (1),(12),(123),(1234),(12345),(123456) = 21

最佳说明如下:

n = 5: 5 + 4 + 3 + 2 + 1
       |   |   |   |   |
       |   |   V   |   |
       |   |   3   |   |  Formula is: (n+1)*((n-1)/2)  +  ((n+1)/2)
       |   +-> 6 <-+   |             [outer pair sets] + [inner value]
       +-----> 6 <-----+
              --
              15

这是n的所有奇数值的公式。对于偶数值,可以使用类似的方法:

n = 6: 6 + 5 + 4   +   3 + 2 + 1
       |   |   |       |   |   |
       |   |   +-> 7 <-+   |   | Formula is:   (n+1)*(n/2)
       |   +-----> 7 <-----+   |            [outer pair sets]
       +---------> 7 <---------+
                  --
                  21

这告诉你n的每个值的嵌套循环的迭代次数(我们称之为x)。

sum的最终值的计算非常相似。在第一次迭代中,您添加零。在第二次迭代中,添加一个。在第三次迭代中,您添加两个。这与计算迭代次数完全相同,只是现在它基于x而不是n而且它是0+1+2+...而不是1+2+3+... ,这意味着我们只需将其应用于x-1而不是x即可使用完全相同的公式。

所以我们可以使用:

if n is odd:
    x <- (n+1) * ((n-1)/2) + ((n+1)/2)
else:
    x <- (n+1) * (n/2)
x <- x - 1
if x is odd:
    sum <- (x+1) * ((x-1)/2) + ((x+1)/2)
else:
    sum <- (x+1) * (x/2)

针对n上的前几个值的算法进行检查:

n  algorithm  formula
-  ---------  -------
0       0         0
1       0         0
2       3         3
3      15        15
4      45        45
5     105       105

所以,完美匹配,至少在选择样本空间的情况下。实际上,您可以更进一步,将其转换为仅基于n的单个公式,而不是计算中间值,但我会将其作为练习留给读者。


提示:适用于奇数和偶数的C公式是:

    x <- ((n+1) * ((n-(n%2))/2)) + ((n%2) * ((n+1)/2))

(虽然仍未对n的负值进行测试 - 您应该在使用公式版本之前对其进行检查。)

答案 1 :(得分:0)

最内层循环(让我们只调用i一个固定数字):

inc递增isum已向inc次添加了i次。 (i *(i-1)/ 2,对吧?)

如果我们假设incsum启动艺术值0,那么这是有效的。如果我们假设它们从某个不同的值开始,我们称之为kl,然后我们知道inc将以值k+i结束。我们知道sum最终会在l+k*i + i*(i-1)/2

现在,i本身从1转到n。嗯......哼让我再考虑一下。