我有以下伪代码:
sum<-0
inc<-0
for i from 1-n
for j from 1 to i
sum<-sum+inc
inc<-inc+1
我被要求找到一个封闭的公式。提示是使用常见的总结。无论我怎么看,我都不能用求和形式编写这段代码。有人能让我知道总结会是什么样子,甚至是递归公式吗?
答案 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
递增i
次
sum
已向inc
次添加了i
次。 (i *(i-1)/ 2,对吧?)
如果我们假设inc
和sum
启动艺术值0,那么这是有效的。如果我们假设它们从某个不同的值开始,我们称之为k
和l
,然后我们知道inc
将以值k+i
结束。我们知道sum
最终会在l+k*i + i*(i-1)/2
。
现在,i
本身从1
转到n
。嗯......哼让我再考虑一下。