Понимание Того, Сколько Раз Будут Выполняться Вложенные Циклы
Я пытаюсь понять, сколько раз оператор " x = x + 1 "выполняется в коде ниже, как функция"n":
for (i=1; i<=n; i++)
for (j=1; j<=i; j++)
for (k=1; k<=j; k++)
x = x + 1 ;
Если я не ошибаюсь, выполняется первый цикл n раз, и второй n (n+1)/2 раз, но на третьем цикле я теряюсь. То есть я могу сосчитать, сколько раз она будет выполнена, но не могу найти формулу или объяснить ее математическими терминами.
можно?
By то, что это не домашнее задание или что-то в этом роде. Я только что нашел книгу и подумал, что это интересная концепция для изучения.
6 ответов
рассмотрим цикл for (i=1; i <= n; i++)
. Тривиально видеть, что это loops n раза. Мы можем нарисовать это как:
* * * * *
теперь, когда у вас есть два вложенных цикла, как это, ваш внутренний цикл будет цикл n (n+1)/2 раза. Обратите внимание, как это образует треугольник, и на самом деле числа этой формы известны как треугольные числа.
* * * * *
* * * *
* * *
* *
*
Итак, если мы расширим это на другое измерение, оно образует тетраэдр. Поскольку я не могу сделать 3D здесь, представьте, что каждый из них наслаивается друг на друга.
* * * * * * * * * * * * * * *
* * * * * * * * * *
* * * * * *
* * *
*
они известны как число тетраэдрических, которые производятся по следующей формуле:
n(n+1)(n+2)
-----------
6
вы должны быть в состоянии подтвердить, что это действительно так с небольшую тестовую программу.
если мы заметим, что 6 = 3!, это не слишком трудно увидеть как этот шаблон обобщается на более высокие измерения:
n(n+1)(n+2)...(n+r-1)
---------------------
r!
здесь r is количество вложенных циклов.
Это число равно числу троек {a, b, c}, где a Поэтому его можно выразить как сочетания с повторениями.. В этом случае общее количество комбинаций с повторениями: n(n+1) (n+2)/6
3-й внутренний цикл такой же, как 2-й внутренний цикл, но ваш n вместо формулы.
Итак, если ваш внешний цикл составляет n раза...
и ваш 2-й цикл n(n+1)/2
раза...
ваш 3-й цикл....
(n(n+1)/2)((n(n+1)/2)+1)/2
это довольно грубая сила и определенно может быть упрощена, но это просто алгоритмическая рекурсия.
вы знаете, сколько раз выполняется второй цикл, чтобы можно было заменить первые два цикла одним правым? как
for(ij = 1; ij < (n*(n+1))/2; ij++)
for (k = 1; k <= ij; k++)
x = x + 1;
применяя ту же формулу, которую вы использовали для первого, где " n " на этот раз n (n+1) / 2 вы будете иметь ((n(n+1) / 2)*(n(n+1)/2+1))/2 - раз выполняется x = x+1.