老师那句“循环固定100次”只在 n>100 时才成立;
当 n≤100 时,循环次数会随 n 变大而线性增长。
先把代码复原成逻辑:
- void fun(int n){
- int x = n, y = 100;
- while (y > 0){
- if (x > 100){
- x -= 10;
- y--;
- }else{
- x++; // 注意:此分支不减少 y
- }
- }
- }
复制代码
精确步数(以循环次数计)
若 n>100:每次都走 if 分支,y 每轮减1,共 100 次,与 n 无关 ⇒ 常数次。
若 n≤100:先要把 x 从 n 增到 101,需 (101−n) 次(全是 else,不减 y)。
之后每“消耗一次 y”要经历:10次 else(把 x 从91涨回101)+1次 if,即 11 次。
从 y=100 减到 0 需要 100 次 if,中间夹着 99 组“10 次 else”。
因此总次数:
- T(n)=(101−n)+100+99×10=1191−n
复制代码
验证:n=0⇒T=1191,与你的实测一致;n=−99999⇒T=101190。
复杂度结论:
- n>100:T(n)=Θ(1)
- n≤100:T(n)=Θ(101−n)=Θ(−n)(当 n→−∞ 时线性增长)
- 最坏情况复杂度:Θ(∣n∣)(更精确地说是 Θ(max{1,101−n}))
老师说的 O(1) 只在默认 输入满足 n>100(或仅关注 if 支路)时成立;对一般 n 而言,上面这份分段与“最坏为线性”才是准确结论。