1.Craps賭博問題
賭博規(guī)則:
??給出兩個色子第一次若搖出7,11點玩家贏灸芳,若搖出的是2涝桅,3,12點則莊家贏烙样,有人勝利則結束本局游戲冯遂,搖出其余點數(shù)繼續(xù)搖,從第二次開始谒获,若搖出的是7點則莊家贏蛤肌,若搖出的與第一次搖出的點數(shù)相同才玩家贏,若搖出其余點數(shù)繼續(xù)搖批狱,規(guī)則同第二次裸准,一直到有人贏,本局游戲結束
完整代碼:
func roll() -> Int {
return Int(arc4random_uniform(6)) + 1
}
var money = 3000
repeat {
print("玩家當前資產(chǎn)\(money)元")
var debt: Int
repeat {
print("請下注:", terminator: "")
debt = inputInt()
} while money < debt || debt <= 0
let firstPoint = roll() + roll()
var needGoOn = false
print("第1次搖\(firstPoint)點")
switch firstPoint {
case 7,11:
print("玩家勝E饬颉3淳恪!")
money += debt
case 2,3,12:
print("莊家勝X酝!O蚝!")
money -= debt
default:
needGoOn = true
}
var index = 2
while needGoOn {
let currentPoint = roll() + roll()
print("第\(index)次搖\(currentPoint)點")
if currentPoint == firstPoint {
money += debt
print("玩家勝>辍=┣邸!")
needGoOn = false
}
else if currentPoint == 7 {
money -= debt
print("莊家勝P』薄D磁伞!")
needGoOn = false
}
index += 1
}
} while money > 0
print("你破產(chǎn)了T涮<恪!")
總結:
??在這個賭博游戲中充分運用了我們學到的循環(huán)控嗜,條件選擇等知識茧彤,repeat在這里運用了兩次,最外面的一次是限制了玩家有錢就繼續(xù)玩疆栏,沒錢就退出循環(huán)曾掂,第二次運用是讓玩家下正確的賭注惫谤,若賭注大于總資產(chǎn)或下注小于等于0就重復要求繼續(xù)下賭注,直到正確下好賭注珠洗,游戲才開始溜歪,后面運用了while循環(huán),充分展示了repeat至少要展示一次和while滿足條件才執(zhí)行的區(qū)別许蓖,若是while循環(huán)蝴猪,上面的賭注初始化時就必須先賦值,至于if語句和switch語句相差不多膊爪,但switch語句展示的更清晰,分支越多switch相對于if越好
注意: 這里的隨機數(shù)必須為16,用兩顆色子自阱,如果用一個數(shù)表示兩個色子,即隨機數(shù)必須為212米酬,會讓他們出現(xiàn)的概率相等
2.百錢百雞問題
**問題:
??已知公雞5元1只动壤,母雞3元1只,小雞1元3只淮逻,如何用100元買一百只雞
**
代碼:
for x in 0...20 {
for y in 0...33 {
let z = 100 - x - y
if (5 * x + 3 * y + z / 3 == 100) && z % 3 == 0 {
print("公雞:\(x)只, 母雞:\(y)只, 小雞:\(z)只")
}
}
}
總結
??這個百錢百雞問題充分運用了窮舉,他改變了我的傳統(tǒng)數(shù)學思維模式阁簸,我當時看到這個題時爬早,第一想法就是列出三元一次方程組,自己可以求解启妹,但怎么讓計算機求解呢筛严,我卡殼了。但看到老師的解法過程后饶米,怎么說呢桨啃,感覺自己頓悟了,對計算機的理解升華了檬输,不再是以前的數(shù)學思維模式了照瘾,覺得窮舉法才是計算機的真正計算方法,窮舉法對我們不適用丧慈,但對于計算機來說才是最簡單的
3.數(shù)組排序問題
var array = [29, 98, 35, 12, 47, 66, 53, 79]
// 冒泡排序: 兩兩比較, 前面的元素比后面的元素大就交換位置
for i in 0..<array.count - 1 {
var swapped = false
for j in 0..<array.count - 1 - i {
if array[j] > array[j + 1] {
(array[j], array[j + 1]) = (array[j + 1], array[j])
swapped = true
}
}
if !swapped {
break
}
}
print(array)
// 簡單選擇排序: 每次從剩下元素中找最小的元素放到對應的位置
for i in 0..<array.count - 1 {
var minIndex = i
for j in i + 1..<array.count {
if array[j] < array[minIndex] {
minIndex = j
}
}
(array[i], array[minIndex]) = (array[minIndex], array[i])
}
print(array)
總結 + 理解
??在Swift語言中數(shù)組有自己排序的函數(shù)析命,但這兩種方式的排序思維是很重要的。
假設是從小到大排序
選擇排序有兩個循環(huán)逃默,內(nèi)循環(huán)是從一個未進行排好序的位置的數(shù)依次與所有元素比較大小鹃愤,外循環(huán)才是給數(shù)組排序,其主要的思想就是用minIndex記住數(shù)組中最小值所對應的索引號完域,首先默認minIndex的值為未進行排序數(shù)組的第一個元素索引號软吐,從第二個位置與之開始循環(huán)比較,比較minIndex所對應的值與當前循環(huán)數(shù)組中所對應的值的大小吟税,若minIndex所對應的值較大凹耙,就把當前循環(huán)數(shù)組中所對應的值賦值給minIndex姿现,然后拿最小值與下一個數(shù)作比較,直到比較完所有的元素使兔,即內(nèi)循環(huán)結束建钥,minIndex的最終值就是數(shù)組中最小值的索引,然后和第一個位置互換位置虐沥,第一個位置就是最小值了熊经;再執(zhí)行外循環(huán)第二次,由于第一個位置已排好序欲险,從第二個位置開始執(zhí)行內(nèi)循環(huán)镐依,同上,直到倒數(shù)第二個位置已排好序天试,即外循環(huán)結束槐壳,最終數(shù)組排好序
冒泡排序也是用了兩個循環(huán),他和選擇排序最大的區(qū)別就是他是兩兩比較得出大小后就交換位置喜每,不需要記下標务唐,直到把最大數(shù)送到數(shù)組中元素的最后,再從剩余數(shù)中再比較带兜,送到剩余數(shù)組中元素的最后枫笛,一直循環(huán),直到第二個元素排好序刚照,即外循環(huán)結束
冒泡排序相對于選擇排序的優(yōu)點是刑巧,他是循環(huán)一次外循環(huán)后,判斷有沒有元素位置發(fā)生改變无畔,若改變了啊楚,繼續(xù)執(zhí)行程序,若沒有改變則說明剩余數(shù)中的位置已是排好序了的浑彰,強行終止循環(huán)恭理。對于將要有規(guī)律的數(shù)組來說,冒泡排序是第一選擇
4.分魚問題
**問題:
??五個人一起打了一天的魚闸昨,晚上他們各自回房睡覺蚯斯,到了第二天,其中一個先醒來饵较,他把魚分成了5份拍嵌,發(fā)現(xiàn)還多了1條,他就扔掉了循诉,拿了屬于自己的那份就走了横辆;接著第二個人又醒了,他也把魚分成了5份茄猫,發(fā)現(xiàn)還多了1條狈蚤,他就扔掉了困肩,拿了屬于自己的那份就走了;后面的人依次醒來脆侮,都做了同樣的事情锌畸,請問魚總共有多少條?
**
代碼:
// 從后往前推
var total = 1
while true {
var fish = total
var isEnough = true
for _ in 1...5 {
if fish * 5 % 4 == 0 {
// 取走的一份與剩下的4份的四分之一相等靖避,可以理解為: fish + 1/4fish + 1
fish = fish * 5 / 4 + 1
}
else {
isEnough = false
break
}
}
if isEnough {
print(fish)
break
}
total += 1
}
// 從前往后推
var total = 1
var isEnough = false
while !isEnough {
var fish = total
isEnough = true
for _ in 1...5 {
if (fish - 1) % 5 == 0 {
fish = (fish - 1) / 5 * 4
}
else {
isEnough = false
break
}
}
total += 1
}
print(total - 1)
總結
??這個分魚問題也運用了窮舉潭枣,他們的思路其實都一樣,只是把條件倒過來幻捏,結果也就倒過來了盆犁,不過倒推fish為魚的總數(shù),順推total為魚的總數(shù)篡九,但比較兩種方法谐岁,從后往前推計算機計算的次數(shù)要小于從前往后的次數(shù),計算機計算所需要花費的時間也就少些榛臼,當人數(shù)越來越多時他們所需要花費的時間差距也就越大伊佃,相比較此方法倒推較好