你必須訓練自己的思想認識並遵循執行模式,並針對具體情況提出一個公式。一般的經驗法則是,如果一個for
循環將運行它內部的代碼x
次,並且它內部有一個運行y
次的循環,那麼內部循環內的代碼將運行x*y
次。
for
循環的最常見的類型1在零和增量開始,直到它達到一定的數量,就像這樣:
for(int i = 0; i < x; i++)
for(int j = 0; j < y; j++)
for(int k = 0; k < z; k++)
// code here runs x * y * z times
要回答你的問題,如果你改變任何for
的任何部分循環,它會改變執行內部代碼的次數。您需要通過考慮邏輯代碼執行來確定執行次數。
for(int i = 1; i < x; i++)
for(int j = 0; j < y * 2; j++)
for(int k = 0; k < z; k += 2)
// code here runs (x - 1) * (y * 2) * (z/2) times
在上面的示例中,每個for
循環都以不同的方式調整。請注意運行次數的總體公式如何保持相同,但現在每次循環每次運行時運行的次數都不相同。
當循環的變量影響多個循環時,事情變得更加複雜。
for(int i = 0; i < x; i++)
for(int j = i; j < y; j++) // notice how `j` starts as `i`
// Code here runs `y` times the first time through the outer loop,
// then `y - 1` times,
// then `y - 2` times,
// ...
// if x < y, the pattern continues until the xth time,
// when this loop runs `y - x` times.
// if x > y, the pattern will stop when y == x, and
// code here will run 0 times for the remainder of
// the loops.
所以在最後一個例子,假設x < y
,循環運行y + (y-1) + (y-2) ... + (y-x)
倍。
這只是算術級數的總和。你可以使用任何你想要的方法來計算迭代的總次數。 – Mikhail
@Mikhail我真的不明白我怎麼能派生出一個公式。 –
未知代碼的複雜性沒有通用公式。 「3個嵌套循環」不能很好地定義算法來進行任何估計。 –