在我的Python书中,该问题要求在运行以下代码后证明x
的值:
x = 0
for i in range(n):
for j in range(i+1, n):
for k in range(j+1, n):
x += 1
我可以看到的是:
i = 0; j=1; k=2: from 2 to n, x+=1, (n-2) times 1
i = 1; j=2; k=3: from 3 to n, x+=1, (n-3) times 1
...
i=n-3; j=n-2; k=n-1: from n-1 to n, x+=1, just 1
i=n-2; j=n-1; k=n doesn't add 1
因此,看来x
是(n-2)+(n-3)+ ... + 1的序列之和?
我不确定如何得到n(n-1)(n-2)/6
的答案。
答案 0 :(得分:4)
查看此问题的一种方法是,您拥有n
值和三个嵌套循环,这些循环被构造为具有非重叠范围。因此,可能的迭代次数等于从n
项中选择三个唯一值的方式数目,或者等于n choose 3
= n!/(3!(n-3)!)
= n(n-1)(n-2)/3*2*1
= n(n-1)(n-2)/6
答案 1 :(得分:1)
只需将for
循环写为sigma:S = sum_{i=1}^n sum_{j=i+1}^n sum_{k = j + 1}^n (1)
。
尝试将总和从内部扩展到外部:
S = sum_{i=1}^n sum_{j=i+1}^n (n - j) = sum_{i=1}^n n(n-i) - ((i+1) + (i+2) + ... + n) = sum_{i=1}^n n(n-i) - ( 1+2+...+n - (1+2+...+i)) = sum_{i=1}^n n(n-i) -(n(n+1)/2 - i(i+1)/2) = sum_{i=1}^n n(n+1)/2 + i(i+1)/2 - n*i = n^2(n+1)/2 + sum_{i=1}^n (i^2/2 + i/2 - n*i)
。
如果打开这个总和并简化它(很简单),您将得到S = n(n-1)(n-2)/6
。