Swift循環(huán)總結

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("玩家勝?。?!")
        money += debt
    case 2,3,12:
        print("莊家勝!?。?)
        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("莊家勝?。?!")
            needGoOn = false
        }
        index += 1
    }
} while money > 0
print("你破產(chǎn)了?。。?)

總結:
??在這個賭博游戲中充分運用了我們學到的循環(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ù)越來越多時他們所需要花費的時間差距也就越大,相比較此方法倒推較好

最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

  • 第一章 緒論 什么是數(shù)據(jù)結構? 數(shù)據(jù)結構的定義:數(shù)據(jù)結構是相互之間存在一種或多種特定關系的數(shù)據(jù)元素的集合。 第二章...
    SeanCheney閱讀 5,986評論 0 19
  • 1.插入排序—直接插入排序(Straight Insertion Sort) 基本思想: 將一個記錄插入到已排序好...
    依依玖玥閱讀 1,347評論 0 2
  • 第5章 引用類型(返回首頁) 本章內(nèi)容 使用對象 創(chuàng)建并操作數(shù)組 理解基本的JavaScript類型 使用基本類型...
    大學一百閱讀 3,666評論 0 4
  • 概述 排序有內(nèi)部排序和外部排序,內(nèi)部排序是數(shù)據(jù)記錄在內(nèi)存中進行排序,而外部排序是因排序的數(shù)據(jù)很大,一次不能容納全部...
    蟻前閱讀 5,297評論 0 52
  • 1. 打印View所有子視圖 2. NSString過濾特殊字符 3. TransForm屬性 4. 去掉分割線多...
    Super_Yuan閱讀 528評論 0 0

友情鏈接更多精彩內(nèi)容