許多初學者只重語法輕邏輯。實則流程控制是「將解題步驟用程式語言描述」的過程。遇到問題,先思考數學/邏輯步驟,再落地為代碼。同一問題可有多種邏輯,需發散思維、多角度嘗試。
問題:求兩自然數最大公約數。如 6(1,2,3,6) 與 9(1,3,9) 的最大公約數為 3。
int n = 6, m = 9, result = 1;
for (int i = 1; i <= n; i++) {
if (n % i == 0 && m % i == 0) {
result = i; // 不斷更新,最終為最大值
}
}
System.out.println(result);
int n = 6, m = 9;
int result = (n > m) ? m : n; // 從較小數開始遞減
for (int i = result; i >= 1; i--) {
if (n % i == 0 && m % i == 0) {
result = i;
break; // 找到即跳出
}
}
System.out.println(result);
同理可推導最小公倍數(LCM)邏輯。
問題:母雞 3 元、公雞 4 元、小雞 0.5 元。100 元買 100 隻雞,各買幾隻?(各類數量可為 0)
for (int i = 0; i <= 100; i++) { // 母雞
for (int j = 0; j <= 100; j++) { // 公雞
for (int k = 0; k <= 100; k++) { // 小雞
if (i + j + k == 100 && i*3 + j*4 + k*0.5 == 100) {
System.out.println("母雞:" + i + " 公雞:" + j + " 小雞:" + k);
}
}
}
}
總計 101³ ≈ 103 萬次迭代,明顯冗餘。
觀察:母雞最多 33 隻(100/3),公雞最多 25 隻(100/4),小雞數量 = 100 - 母雞 - 公雞。
for (int i = 0; i <= 33; i++) { // 母雞 0~33
for (int j = 0; j <= 25; j++) { // 公雞 0~25
int k = 100 - i - j; // 小雞數量直接推導
if (i*3 + j*4 + k*0.5 == 100) {
System.out.println("母雞:" + i + " 公雞:" + j + " 小雞:" + k);
}
}
}
迭代次數驟降至 34×26 = 884 次,效能提升三個數量級。可再進一步優化(如利用模運算預判),此處不贅述。
解題關鍵:① 透徹理解問題 ② 建立數學模型 ③ 選擇恰當迴圈結構 ④ 持續優化邏輯。這才是流程控制學習的真諦。