loops - que - iteraciones anidadas
Un rompecabezas relacionado con bucles anidados (1)
- Primero, escribí un código
C
para generar suma:
int main(){ int i =0, k =0, j =0, n =0; int N =0; int sum =0; N =10; for (n=1; n <= N; n++){ // unindented code here sum =0; for (i=1; i<=n; i++) for (j=1; j<=i; j++) for (k=1; k<=j; k++) sum++; printf("/n N=%d sum = %d",n, sum); } printf("/n"); }
- Compilación simple y resultado de generación para
N=1 to N=10
:
$ gcc sum.c
$ ./a.out
N=1 sum = 1
N=2 sum = 4
N=3 sum = 10
N=4 sum = 20
N=5 sum = 35
N=6 sum = 56
N=7 sum = 84
N=8 sum = 120
N=9 sum = 165
N=10 sum = 220
Entonces, Intenté explorar
How this works?
con algunos diagramas:Para,
N=1
:
i<=N, (i=1) | j<=i, (j=1) | k<=j, (K=1) | sum=0. sum++ ---> sum = 1
Eso es (1) = 1
Para, N=2
:
i<=N, (i=1)-------(i=2) | |-----|-----| j<=i, (j=1) (j=1) (j=2) | | |----|----| k<=j, (K=1) (K=1) (K=1) (K=2) | | | | sum=0, sum++ sum++ sum++ sum++ --> sum = 4
Eso es (1) + (1 + 2) = 4
Para, N=3
:
i<=N, (i=1)-------(i=2)--------------------(i=3) | |-----|-----| |---------|-------------| j<=i, (j=1) (j=1) (j=2) (j=1) (j=2) (j=3) | | |----|----| | |----|----| |-----|-----| k<=j, (K=1) (K=1) (K=1) (K=2) (K=1) (K=1) (K=2) (K=1) (K=2) (K=3) | | | | | | | | | | sum=0, sum++ sum++ sum++ sum++ sum++ sum++ sum++ sum++ sum++ sum++ --> sum = 10
Eso es (1) + (1 + 2) + (1 + 2 + 3) = 10
N = 1, (1) = 1
N = 2, (1) + (1 + 2) = 4
N = 3, (1) + (1 + 2) + (1 + 2 + 3) = 10
N = 4, (1) + (1 + 2) + (1 + 2 + 3) + (1 + 2 + 3 + 4) = 20
N = 5, (1) + (1 + 2) + (1 + 2 + 3) + (1 + 2 + 3 + 4) + (1 + 2 + 3 + 4 + 5) = 35
Finalmente, pude entender que la suma de N
en tres ciclos es:
(1) + (suma de 0f 1 a 2) + ... + (suma de 1 a (N-2)) + (suma de 1 a (N-1)) + (suma de 1 a N)
o podemos escribirlo como:
=> (1) + (1 + 2) + ... + (1 + 2 + .... + i) + ... + (1 + 2 + .... + N-1) + (1 + 2 + .... + N)
=> (N * 1) + ((N-1) * 2) + ((N-2) * 3) + ... + ((N -i + 1) * i) + ... + (1 * N)
Puede consultar aquí para los cálculos de simplificación: (pregunté AQUÍ )
[ SU RESPUESTA ]
= ( ((N) * (N+1) * (N+2)) / 6 )
Y, creo que es correcto. Lo revisé de la siguiente manera:
N = 1, (1 * 2 * 3)/6 = 1
N = 2, (2 * 3 * 4)/6 = 4
N = 3, (3 * 4 * 5)/6 = 6
N = 4, (4 * 5 * 6)/6 = 10
N = 5, (5 * 6 * 7)/6 = 35
Además, la complejidad de este algoritmo es O (n 3 )
EDITAR :
El siguiente ciclo también tiene los mismos números de conteo, es decir = ( ((N) * (N+1) * (N+2)) / 6 )
for i in 1 … N loop
for j in i … N loop
for k in j … N loop
sum = sum + i ;
end loop;
end loop;
end loop;
Para una entrada N dada, ¿cuántas veces se ejecuta la instrucción adjunta?
for i in 1 … N loop
for j in 1 … i loop
for k in 1 … j loop
sum = sum + i ;
end loop;
end loop;
end loop;
¿Alguien puede encontrar una manera fácil o una fórmula para hacer esto en general? Por favor explique.