怎樣從五個(gè)人分魚游戲提煉模型,以及如何優(yōu)化代碼?
版本一:
var total = 1
var bool = true
while bool{
// 用當(dāng)次循環(huán)時(shí)total的值作為魚的總數(shù)
var fish = total
// 假設(shè)魚的數(shù)量足夠五個(gè)人分
var isEnough = true
//通過(guò)循環(huán)模擬五個(gè)人分魚的過(guò)程
for _ in 1...5 {
// 檢查剩下的與是否夠分
if (fish - 1) % 5 == 0 {
fish = (fish - 1) / 5 * 4
}
else{
// 如果魚不夠分就將isEnough賦值為false并提前結(jié)束分魚的循環(huán)
isEnough = false
bool = true
}
}
if isEnough{
print(total)
bool = false
}
total += 1
}
版本二:(對(duì)版本一的優(yōu)化)
var total = 1
var bool = true
while bool {
// 用當(dāng)次循環(huán)時(shí)total的值作為魚的總數(shù)
var fish = total
// 假設(shè)魚的數(shù)量足夠五個(gè)人分
var isEnough = true
//通過(guò)循環(huán)模擬五個(gè)人分魚的過(guò)程
for _ in 0..<5 {
// 檢查剩下的與是否夠分
if (fish - 1) % 5 == 0 {
fish = (fish - 1) / 5 * 4
}
else {
//如果魚不夠分就將isEnough賦值為false并提前結(jié)束分魚的循環(huán)
isEnough = false
break
}
}
if isEnough {
print(total)
bool = false
}
else { total += 1 }
}
:對(duì)版本一的優(yōu)化主要在兩個(gè)方面:
- 版本二在if-else語(yǔ)句判斷中加了break,通過(guò)測(cè)試發(fā)現(xiàn)如果不加break 循環(huán)會(huì)做完五次。
else {
//如果魚不夠分就將isEnough賦值為false并提前結(jié)束分魚的循環(huán)
isEnough = false
break
}
- 版本二最后一條語(yǔ)句加了else關(guān)鍵字
else { total += 1 }
如何提煉模型
這個(gè)程序流程:while循環(huán) {->[5次for循環(huán)(->分支)]->[分支]}的結(jié)構(gòu) ---線性的結(jié)構(gòu)(也可理解為樹狀結(jié)構(gòu))
如何終止循環(huán): 1 while循環(huán):用布爾值 2. for 循環(huán) 用brak
另一個(gè)問(wèn)題: 如何判斷是執(zhí)行了5次for循環(huán)的if中的代碼,還是有一次執(zhí)行了else中的代碼?
答案在題目中最后的分支 加else 是為了讓最后的兩部分代碼 成為分支結(jié)構(gòu) 而不是線性結(jié)構(gòu)